0

SOに関する最初の質問と重複する可能性のある質問をするために十字架につけられる準備ができていますが、一生見つけることができません。

製品テーブル、リンク テーブル、名前付きの子テーブルの 3 つのテーブルがあります。SQLFiddleにプリロードされています>>まだあなたの注意が必要な場合。

CREATE TABLE Product (iProductID int NOT NULL PRIMARY KEY
                    , sProductName varchar(50) NOT NULL
                    , iPartGroupID int NOT NULL)
INSERT INTO Product VALUES
(10001, 'Avionic Tackle', '1'),
(10002, 'Eigenspout', '2'),
(10003, 'Impulse Polycatalyst', '3'),
(10004, 'O-webbing', '2'),
(10005, 'Ultraservo', '3'),
(10006, 'Yttrium Coil', '5')

CREATE TABLE PartGroup (iPartGroupID int NOT NULL
                      , iChildID int NOT NULL)
INSERT INTO PartGroup VALUES
(1, 1),
(2, 2),
(3, 1),
(3, 2),
(3, 3),
(3, 4),
(4, 5),
(4, 6),
(5, 1)

CREATE TABLE PartNames (iChildID int NOT NULL PRIMARY KEY
                      , sPartNameText varchar(50) NOT NULL)
INSERT INTO PartNames VALUES
(1, 'Bulbcap Lube'),
(2, 'Chromium Deltaquartz'),
(3, 'Dilation Gyrosphere'),
(4, 'Fliphose'),
(5, 'G-tightener Bypass'),
(6, 'Heisenberg Shuttle')

すべてのパーツ グループ (製品に属している場合と属していない場合があります) を一覧表示し、それらの子の名前を翻訳する方法を見つけようとしています。つまり、リンク テーブルと子名テーブルのみを使用して、リンク テーブルのすべての翻訳済み要素を一覧表示するにはどうすればよいでしょうか。私は孤児を見つけようとしています。

2 つのクエリがあります。

SELECT P.iPartGroupID
    ,STUFF(
        (SELECT
            CONCAT(', ', PN.sPartNameText)
            FROM PartGroup PG
            INNER JOIN PartNames PN ON PN.iChildID = PG.iChildID
         WHERE PG.iPartGroupID = P.iPartGroupID
         FOR XML PATH(''), TYPE
        ).value('.', 'VARCHAR(MAX)')
        , 1, 2, ''
        ) AS [Child Elements]
FROM Product P
GROUP BY P.iPartGroupID

これは、製品に属するすべての部品グループとその子要素を名前別にリストします。iPartGroupID = 4 はここにありません。

私も持っています:

SELECT PG.iPartGroupID
    ,STUFF(
        (SELECT
            CONCAT(', ', PGList.iChildID)
            FROM PartGroup PGList
            WHERE PGList.iPartGroupID = PG.iPartGroupID
            FOR XML PATH(''), TYPE
        ).value('.', 'VARCHAR(MAX)')
        , 1, 2, ''
        ) AS [Child Elements]
FROM PartGroup PG
GROUP BY PG.iPartGroupID

これにより、すべてのパーツ グループとその子要素がコード別に一覧表示されます。ここでは iPartGroupID = 4 について説明しますが、名前は翻訳されていません。

孤立したパーツ グループ (および孤立したパーツ) を一覧表示するために使用できるクエリは次のとおりです。

 4     G-tightener Bypass, Heisenberg Shuttle

他のすべてのパーツ グループのリストに含まれていることが理想ですが、含まれていない場合は、結果を統合できます。

私が調べた他のすべてのSOの質問は、3つのテーブルまたは1つのテーブルのみを使用し、エイリアスと自己結合しています。誰にもアイデアはありますか?

CONCATパーツ名に XML はなく、またはの特定の好みもありませんSELECT '+'

他の投稿にリンクしますが、ポイントなしではできません:(

4

2 に答える 2

0

「翻訳」という言葉を使用するとき、正確に何を意味するのか完全にはわかりません. そして、あなたの必要な出力はあなたのサンプルデータと矛盾しているようです(私が何かを失っていなければ)。

それにもかかわらず、このクエリを試してみてください。おそらくそれが必要なものです。

select sq.iPartGroupID, cast((
    select pn.sPartNameText + ',' as [data()] from @PartNames pn
        inner join @PartGroup p on pn.iChildID = p.iChildID
    where p.iPartGroupID = sq.iPartGroupID
    order by pn.iChildID
    for xml path('')
    ) as varchar(max)) as [GroupList]
from (select distinct pg.iPartGroupID from @PartGroup pg) sq
    left join @Product pr on sq.iPartGroupID = pr.iPartGroupID
where pr.iProductID is null;
于 2014-08-13T07:00:25.133 に答える
0

次の方法で、必要な答えを得ることができます

SELECT pg.iPartGroupID,
   CASE COUNT(pg.iPartGroupID)
        WHEN 1 THEN (
                 SELECT pn2.sPartNameText
                 FROM   PartNames pn2
                 WHERE  pn2.iChildID = pg.iPartGroupID
             )
        ELSE (
                 SELECT CASE ROW_NUMBER() OVER(ORDER BY(SELECT 1))
                             WHEN 1 THEN ''
                             ELSE ','
                        END + pn2.sPartNameText
                 FROM   PartNames pn2
                        INNER JOIN PartGroup pg2
                             ON  pg2.iChildID = pn2.iChildID
                 WHERE  pg2.iPartGroupID = pg.iPartGroupID
                        FOR XML PATH('')
             )
   END
FROM   PartGroup pg
GROUP BY
   pg.iPartGroupID
于 2014-08-13T13:07:22.080 に答える