2012-10-17 48 views
1

SQL大师递归得到查询结果的数据在SQL

我有一个表结构如下

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

我需要编写一个查询,将递归遍历表中找到合作伙伴。

即获得一个ID说Id1的在这里,我需要拔出Id1的地方被列为合作伙伴的所有名字,所以我的查询需要拉起NAME3和NAME。随后在同一个查询中,我还需要提取Name3和Name2也列为合作伙伴的名称。因此,在这种情况下,如果我给输入SP作为Id1的我应该得到有效读取如下

Id   Name 
    Id2   name2 
    Id3   name3 
    Id4   name4 
    Id5   name5 

我还没有在SQL递归地获取数据的工作列表。有人告诉我,我可以使用普通表格表达式,但我没有看到这对我有什么帮助。我一直在为这个问题烦恼了一整天,而我所能想出的就是使用游标的想法。

在这方面的任何帮助,帮助

+0

我不知道确切的情况,什么你的意思是递归的吗?你能解释一下吗?您将需要编写一个递归地访问数据库的程序。 –

+0

它可能是多个,也就是说Id1可以与Id3合作,Id4和Id2也可以与Id3和id4合作。 – Vish

+0

我完全不了解你。但我认为你需要一个非常简单的Select查询。选择从表*其中IdPartner = Id1的 –

回答

0

以下收益相关,但不请,行:

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