1

SQL の達人

次のようなテーブル構造があります

Id        Name        IdPartner
Id1       name1           
Id2       Name2       Id1
Id3       name3       Id1
Id4       name4       Id2
Id5       name5       Id3

テーブルを再帰的にループしてパートナーを見つけるクエリを作成する必要があります。

つまり、ここで Id1 と言う Id が与えられた場合、Id1 がパートナーとしてリストされているすべての名前を抽出する必要があるため、クエリで Name3 と Name2 を抽出する必要があります。その後、同じクエリで、Name3 と Name2 もパートナーとしてリストされている名前を取得する必要があります。したがって、この場合、SP に Id1 として入力を与えると、以下のようなリストを効果的に取得する必要があります。

   Id          Name
  Id2         name2
  Id3         name3
  Id4         name4
  Id5         name5

SQLでデータを再帰的に取得する作業はしていません。共通のテーブル式を使用できると誰かに言われましたが、それがどのように役立つかわかりません。私はこれに1日以上頭を悩ませてきましたが、思いつくのはカーソルを使用するというアイデアだけです。

この点に関するヘルプは役立ちます

4

2 に答える 2

1

以下は、関連するが要求されていない行を返します。

declare @Gurus as Table ( Id VarChar(4), Name VarChar(16), IdPartner VarChar(4) )
insert into @Gurus ( Id, Name, IdPartner ) values
  ( 'Id1', 'name1', NULL ),
  ( 'Id2', 'Name2', 'Id1' ),
  ( 'Id3', 'Name3', 'Id1' ),
  ( 'Id4', 'Name4', 'Id2' ),
  ( 'Id5', 'Name5', 'Id3' )

declare @TargetId as VarChar(4) = 'Id1'

; with RelatedGurus as (
  -- Anchor: Get the rows that are partners of the target row.
  select Id, Name, IdPartner
    from @Gurus
    where IdPartner = @TargetId
  union all
  -- Recursion: Add any rows that are partners to the rows just added.
  select G.Id, G.Name, G.IdPartner
    from @Gurus as G inner join
      RelatedGurus as RG on RG.Id = G.IdPartner )
  -- Display the result.
  select Id, Name
    from RelatedGurus
    order by Name
于 2012-10-17T18:13:18.043 に答える
0

このクエリを試してください

    IF OBJECT_ID('tempdb..#tmptesttable') IS NOT NULL 
        DROP TABLE #tmptesttable

    DECLARE @ParentID NVARCHAR(50)
    SET @ParentID = 'Id1'

    SELECT 
        *
    INTO
        #tmptesttable
    FROM 

    (
        SELECT 'Id1','name1', NULL UNION ALL          
        SELECT 'Id2','Name2', 'Id1' UNION ALL
        SELECT 'Id3','name3', 'Id1' UNION ALL
        SELECT 'Id4','name4', 'Id2' UNION ALL
        SELECT 'Id5','name5', 'Id3'
    ) testData (Id,Name,IdPartner)

    ;WITH cteHierarchy AS (
        SELECT Id,Name,IdPartner FROM #tmptesttable WHERE Id = @ParentID
        UNION ALL
        SELECT 
            tmptesttable.Id,tmptesttable.Name,tmptesttable.IdPartner 
        FROM 
            #tmptesttable  tmptesttable
        INNER JOIN
            cteHierarchy
        ON
            cteHierarchy.Id = tmptesttable.IdPartner
    )
    SELECT * FROM cteHierarchy WHERE IdPartner IS NOT NULL
于 2012-10-18T09:47:41.343 に答える