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 将只有一个层次结构。
实际上,这相当简单:
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子句中,以解释其工作原理。