SQL Server父/子排序(可能的递归?)
我想生成一个查询,列出一个父节点及其每个子节点,并且子节点(等等)在彼此下面。与您构建带有回复和回复的评论的方式完全相同 例如,给定以下数据:SQL Server父/子排序(可能的递归?),sql,sql-server,Sql,Sql Server,我想生成一个查询,列出一个父节点及其每个子节点,并且子节点(等等)在彼此下面。与您构建带有回复和回复的评论的方式完全相同 例如,给定以下数据: ID ParentID -------------- 1 0 2 0 3 2 4 2 5 0 6 1 7 2 8 7 我希望得到如下结构的查询: ID ParentID -------------- 1 0 6 1 2 0 3 2 4 2 7 2 8
ID ParentID
--------------
1 0
2 0
3 2
4 2
5 0
6 1
7 2
8 7
我希望得到如下结构的查询:
ID ParentID
--------------
1 0
6 1
2 0
3 2
4 2
7 2
8 7
5 0
我知道我需要一个递归的CTE,我相信,但是怎么做呢
谢谢试试这样的
;WITH
cte (EmpID, ParentID, EmpLevel)
AS
(
SELECT ID, ParentID, 1
FROM Table
WHERE ParentID = 0
UNION ALL
SELECT t.ID, t.ParentID,c.EmpLevel + 1
FROM Table t
INNER JOIN cte c
ON t.ParentID = c.EmpID
)
SELECT
EmpID,EmpLevel
FROM cte
ORDER BY EmpID,EmpLevel
似乎您希望对存储在表中的树结构执行DFS(深度优先搜索)
0
/ | \
/ | \
/ | \
/ | \
1 2 5
| / | \
6 3 4 7
|
8
代码的逻辑是:
DFS(Node p){
children = GetChildren(p)
foreach (c in children) {
Print("ID: " + c + " Parent ID: " + p)
DFS(c)
}
}
现在是SQL Server。
选择直接作为给定节点子节点的节点很容易:
SELECT [ID] FROM [Table] WHERE [ParentID] = @parentID
创建临时表以存储结果:
CREATE TABLE #temp(ID int, ParentID int);
然后递归地选择结果表,或者在while循环中执行。这是否需要多个级别的家长:可能是(9,8)吗?@TI非常感谢-在链接到帖子中授予您。提示:通常使用NULL的
ParentID
表示顶级节点。它避免了对幻数的特殊处理,也避免了将节点设置为自己的父节点以指示根的混淆。