2013-05-26 50 views
3

我有如下所示如何遍歷與自身相關的表格?

Node_Id  Node_Name  Parent_Node_Id 
-------  ---------  -------------- 
1   Root   0 
2   Node1   1 
3   Node2   1 
4   Node3   2 
5   Node4   2 
6   Node5   5 
7   Node6   5 
8   Node7   7 

表中的每一行的表格已經由所述「Parent_Node_Id」和每行/節點指示父行可以是任何數量的行/節點的父節點。

如何編寫一個查詢,該查詢將給出具有共享同一父節點的父節點的所有節點的列表? Parent_Node_Id將作爲參數傳遞。例如,如果Parent_Node_Id作爲2通電,查詢將返回以下 -

Node_Id  Node_Name  Parent_Node_Id 
-------  ---------  -------------- 
4   Node3   2 
5   Node4   2 
6   Node5   5 
7   Node6   5 
8   Node7   7 

回答

3
;WITH CTE AS (
    SELECT Node_Id,Node_Name, Parent_Node_Id 
    FROM @a WHERE Parent_Node_Id = 2 
    UNION ALL 
    SELECT c.Node_Id,c.Node_Name, c.Parent_Node_Id 
    FROM @a c 
    INNER JOIN CTE p ON p.Node_Id = c.Parent_Node_Id 
) 
Select * from CTE 

帶有示例數據

Declare @a Table(Node_Id int, Node_Name varchar(100),  Parent_Node_Id int) 
insert into @a 

select 1,'Root',0 
UNION SELECT 2,'Node1',1 
UNION SELECT 3,'Node2',1 
UNION SELECT 4,'Node3',2 
UNION SELECT 5,'Node4',2 
UNION SELECT 6,'Node5',5 
UNION SELECT 7,'Node6',5 
UNION SELECT 8,'Node7',7 
+1

哇!我不知道'With'子句可以像這樣使用。謝謝。 – th1rdey3