按名称排序的父子层次结构

Alf*_*ori 5 sql sql-server parent-child sql-order-by

我想为以下内容创建 SQL Server 查询。我有这样的数据:

Id       Name       parentId
1         STU        0
2         XYZ        5
3         PQR        5
4         EFG        0
5         ABC        0
6         HIJ        1
7         DEF        1
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的查询:

SELECT *
FROM TABLE
ORDER BY CASE WHEN parentId = 0 THEN id ELSE parentId END ASC, id ASC
Run Code Online (Sandbox Code Playgroud)

输出(父级及其子级排序在一起):

Id       Name       parentId
1         STU        0
6         HIJ        1
7         DEF        1
4         EFG        0
5         ABC        0
2         XYZ        5
3         PQR        5
Run Code Online (Sandbox Code Playgroud)

现在我还需要按姓名排序,首先按父母的姓名,然后是所有孩子,也按姓名排序。预期的输出是:

Id       Name       parentId
5         ABC        0
3         PQR        5
2         XYZ        5
4         EFG        0
1         STU        0
7         DEF        1
6         HIJ        1
Run Code Online (Sandbox Code Playgroud)

有没有人对此有解决方案?为此,我需要严格的 SQL Server 查询。

PS 将只有一个层次结构。

Sal*_*n A 3

实际上,这相当简单:

SELECT
    category.*,
    -- bring parent and its children together
    CASE WHEN parent.Id IS NULL THEN category.Name ELSE parent.Name END AS sort1,
    -- move parent to top followed by its children
    CASE WHEN parent.Id IS NULL THEN NULL ELSE category.Name END AS sort2
FROM category
LEFT JOIN category AS parent ON category.parentId = parent.Id
ORDER BY sort1, sort2
Run Code Online (Sandbox Code Playgroud)

输出:

SELECT
    category.*,
    -- bring parent and its children together
    CASE WHEN parent.Id IS NULL THEN category.Name ELSE parent.Name END AS sort1,
    -- move parent to top followed by its children
    CASE WHEN parent.Id IS NULL THEN NULL ELSE category.Name END AS sort2
FROM category
LEFT JOIN category AS parent ON category.parentId = parent.Id
ORDER BY sort1, sort2
Run Code Online (Sandbox Code Playgroud)

请注意,我已将排序计算放在SELECT子句中,以解释其工作原理。