2012-10-17 51 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