2011-10-15 15 views
2

如何在SQL Server中執行遞歸自連接? 我有這樣一個表:如何在SQL Server中進行上遞歸自聯接?

 
TableID | ParentID 
    1 |  NULL 
    2 |  1 
    3 |  1 
    4 |  3 
    5 |  NULL 
    6 |  4 
    7 |  6 

我想根據,以得到下面的結果給出TableID讓所有相關TableIDParentsID,比方說,我想所有的家長爲TableID = 6

 
TableID 
    6 
    4 
    3 
    1 

我卡在這,我不知道如何獲得的結果在SQL查詢... 希望能告訴我SQL查詢來獲取先前數據

+3

使用遞歸cte。 http://msdn.microsoft.com/en-us/library/ms186243.aspx –

+0

標準SQL不支持遞歸查詢。有一些擴展,比如oracle的「通過事先連接」這樣做,但它們是擴展和非標準的。這種事情的通常方法是在一個循環中做一系列的查詢。 –

+1

@MarcB但他標記了sql-server :-)所以它是tsql。 – xanatos

回答

5

應該

; WITH MyQuery (TableID, ParentID, Level) AS 
(
    SELECT M.TableID, M.ParentID, 0 AS Level 
     FROM MyTable M 
     WHERE M.TableID = 6 -- Here it's the row number where the query starts 

    UNION ALL 

    SELECT M.TableID, M.ParentID, Q.Level + 1 
     FROM MyTable M 
     INNER JOIN MyQuery Q ON M.TableID = Q.ParentID 
) 

SELECT * FROM MyQuery; 

和寫Byers公司,這是一個Recursive Queries Using Common Table Expressions

Level列是無用的(這是不是「沒用沒用」。對你所問的問題沒用),我已經添加了它,因爲它經常被插入到這些遞歸查詢中。如果您不需要它,請從它出現的三個地方刪除它。

這似乎是複雜得多做Level反向(以便盛大隆重的父親是0級,他的孩子的是1級...)

請注意,此代碼將與SQL工作服務器> = 2005