AaA*_*AaA 7 sql sql-server common-table-expression
我有以下分层树表
GO
DROP TABLE #tbl
GO
CREATE TABLE #tbl (Id int , ParentId int)
INSERT INTO #tbl (Id, ParentId) VALUES (0, NULL)
INSERT INTO #tbl (Id, ParentId) VALUES (1, 0)
INSERT INTO #tbl (Id, ParentId) VALUES (2, 1)
INSERT INTO #tbl (Id, ParentId) VALUES (3, 1)
INSERT INTO #tbl (Id, ParentId) VALUES (4, 2)
INSERT INTO #tbl (Id, ParentId) VALUES (5, 2)
INSERT INTO #tbl (Id, ParentId) VALUES (6, 3)
INSERT INTO #tbl (Id, ParentId) VALUES (7, 3)
GO
Run Code Online (Sandbox Code Playgroud)
哪个映射到后面的树
0
+- 1
+- 2
+- 4
+- 5
+- 3
+- 6
+- 7
Run Code Online (Sandbox Code Playgroud)
使用CTE Recursive表,如何获取所选节点的路径以及所有子节点.例如,2
作为输入,我如何获得以下数据(如果可能,请订购)
Id, ParentID
-------
0, NULL
1, 0
2, 1
4, 2
5, 2
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过以下语句遍历树(获取路径)
WITH RecursiveTree AS (
-- Anchor
SELECT *
FROM #tbl
WHERE Id = 2
UNION ALL
-- Recursive Member
SELECT Parent.*
FROM
#tbl AS Parent
JOIN RecursiveTree AS Child ON Child.ParentId = Parent.Id
)
SELECT * FROM RecursiveTree
Run Code Online (Sandbox Code Playgroud)
并通过以下陈述,在树中遍历(让所有孩子)
WITH RecursiveTree AS (
-- Anchor
SELECT *
FROM #tbl
WHERE Id = 2
UNION ALL
-- Recursive Member
SELECT Child.*
FROM
#tbl AS Child
JOIN RecursiveTree AS Parent ON Child.ParentId = Parent.id
)
SELECT * FROM RecursiveTree
Run Code Online (Sandbox Code Playgroud)
问题:如何将这两个命令合并为一个?
只需使用这两个选择的 UNION
WITH RecursiveTree AS (
-- Anchor
SELECT *
FROM #tbl
WHERE Id = 2
UNION ALL
-- Recursive Member
SELECT Parent.*
FROM
#tbl AS Parent
JOIN RecursiveTree AS Child ON Child.ParentId = Parent.Id
),
RecursiveTree2 AS
(
-- Anchor
SELECT *
FROM #tbl
WHERE Id = 2
UNION ALL
-- Recursive Member
SELECT Child.*
FROM
#tbl AS Child
JOIN RecursiveTree2 AS Parent ON Child.ParentId = Parent.id
)
select * from
(
SELECT * FROM RecursiveTree
union
SELECT * FROM RecursiveTree2
) t
order by id
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2413 次 |
最近记录: |