1

SQL 大师

我有一个表结构如下

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

我需要编写一个查询,该查询将递归循环遍历表以查找合作伙伴。

即在这里给定一个 ID 说 Id1,我需要提取所有将 Id1 列为合作伙伴的名称,因此我的查询需要提取 Name3 和 Name2。随后在同一个查询中,我还需要提取 Name3 和 Name2 也被列为合作伙伴的名称。因此,在这种情况下,如果我将输入作为 Id1 提供给 SP,我应该有效地获得一个如下所示的列表

   Id          Name
  Id2         name2
  Id3         name3
  Id4         name4
  Id5         name5

我还没有使用递归方式获取 SQL 中的数据。有人告诉我我可以使用公用表表达式,但我看不出这对我有什么帮助。我已经为此烦恼了一天多,我所能想到的就是使用光标的想法。

这方面的任何帮助都有帮助

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 回答