SQL递归id节点

时间:2017-01-17 07:11:53

标签: sql sql-server recursion nodes

我有一个像这样的表结构

Id     Desc     Node
---------------------
1      A
2      Aa       1
3      Ab       1
4      B
5      Bb       4
6      Bb1      5

这些Desc值会在列表视图中显示给用户,如果用户选择Bb,我希望ID 5以及ID 4因为根节点如果用户选择Bb1,则需要ID 654

我只能查询一个级别,但可能会有n级别,所以此刻我的查询看起来像这样

SELECT Id 
FROM tbl 
WHERE Desc = 'Bb1' 
   OR Id = (SELECT Node FROM tbl WHERE Desc = 'Bb1'); 

1 个答案:

答案 0 :(得分:0)

您可以使用下面的递归CTE

执行此操作

架构:

CREATE TABLE #TAB (ID INT, DESCS VARCHAR(10), NODE INT)

INSERT INTO #TAB
SELECT 1 AS ID, 'A' DESCS, NULL NODE
UNION ALL
SELECT 2 , 'AA', 1
UNION ALL
SELECT 3, 'AB', 1
UNION ALL
SELECT 4, 'B', NULL
UNION ALL
SELECT 5, 'BB', 4
UNION ALL
SELECT 6, 'BB1', 5

现在执行递归CTE以获取节点值并使用Join在#TAB上再次应用它。

;WITH CTE AS(
SELECT  ID, DESCS, NODE FROM #TAB WHERE ID=6
UNION ALL
SELECT  T.ID, T.DESCS, T.NODE FROM #TAB T 
INNER JOIN CTE C ON T.ID = C.NODE 
)
SELECT * FROM CTE

当你将6传递给CTE中的第一个查询时,结果将是

+----+-------+------+
| ID | DESCS | NODE |
+----+-------+------+
|  6 | BB1   | 5    |
|  5 | BB    | 4    |
|  4 | B     | NULL |
+----+-------+------+