sql - 如何使用 SQL Query 对表记录进行排序,父项后跟子项
问题描述
我有一个表,其中很少有记录,其父记录如下所示。并非所有人都有父母记录。
id | parent_id
--------------
1 | 0
2 | 0
3 | 1
4 | 0
5 | 0
6 | 0
7 | 5
我希望以父母后跟孩子的方式订购记录:
id | parent_id
--------------
1 | 0
3 | 1
2 | 0
4 | 0
5 | 0
7 | 5
6 | 0
如何在不使用存储过程的情况下使用 SQL 查询来实现这一点?
我正在使用postgres。
解决方案
假设像您的示例所暗示的那样,可能只有一层层次结构:
SELECT child.*
FROM tbl AS child
LEFT JOIN tbl AS parent ON parent.id = child.parent_id
ORDER BY COALESCE(parent.id, child.id) -- order by parent if exists
, parent.id IS NOT NULL -- parent first per group
, child.id; -- order rest by id
仅当我们按“名称”之类的附加属性进行排序时才需要连接(这是典型的情况,因为代理 ID 的值没有意义)。虽然仅像您演示的那样按 ID 排序,但我们不需要连接,因为所有信息都已经存在(就像 Gordon 也演示的那样)。然后我们可以简化:
SELECT *
FROM tbl
ORDER BY CASE WHEN parent_id = 0 THEN id ELSE parent_id END
, parent_id <> 0
, id;
- 第二
ORDER BY
项需要在其子项之前对父项进行排序。工作,因为FALSE
排序之前TRUE
。看: ORDER BY
只有当可以有多个孩子时才需要最后一项。
db<>fiddle here - 使用扩展测试用例来证明ORDER BY
项目的相关性。
推荐阅读
- python - Python/Selenium Firefox 驱动程序在 Ubuntu 上失败,在 Windows 上正常
- python-3.x - 使用 selenium 打开时如何捕获错误 url 的异常信息?
- python - 如何通过结合元组和静态字符串来使用 itertools 创建字典
- ruby-on-rails - 语法错误,意外结束,期待输入结束,虽然我认为它有正确的结束编号
- numpy-ndarray - 有没有办法将一个大小为 1235 的 numpy 数组从 1D 重塑为 2D
- javascript - 循环发送消息
- mongodb - 我正在尝试使用请求创建新的购物车模式
- swift - iOS13上下文菜单点击时如何显示或导航到当前的查看视图
- javascript - 如何使用 fetch 将查询参数发送到服务器?
- javascript - 将 JS 代码转换为 React.js,看不到我做错了什么