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
表示顶级节点。它避免了对幻数的特殊处理,也避免了将节点设置为自己的父节点以指示根的混淆。