gpt4 book ai didi

sql - 如何制作 ORDER SIBLINGS BY?

转载 作者:行者123 更新时间:2023-11-29 11:41:45 25 4
gpt4 key购买 nike

我正在使用 PostgreSQL 9.1.6 并尝试构建递归 SQL。
我想像 SQL-Server 中的 ORDER SIBLINGS BY 那样排序。

编者注:这可能是指 Oraclewhere ORDER SIBLINGS BY actually exists .

测试表:

create table RECURSIVE_TEST(
EMP_ID int,
MANAGER_ID int,
EMP_NAME varchar(30)
);

insert into recursive_test values
(1 ,0 ,'MANAGER1'),
(2 ,0 ,'MANAGER2'),
(3 ,0 ,'MANAGER3'),
(4 ,0 ,'MANAGER4'),
(5 ,1 ,'emp1'),
(6 ,3 ,'emp2'),
(7 ,4 ,'emp3'),
(8 ,2 ,'emp4'),
(9 ,2 ,'emp5'),
(10 ,3 ,'emp6'),
(11 ,4 ,'emp7'),
(12 ,3 ,'emp8'),
(13 ,4 ,'emp9'),
(14 ,2 ,'emp10'),
(15 ,2 ,'emp11'),
(16 ,1 ,'emp12');

查询:

WITH RECURSIVE T AS
(
SELECT A.EMP_ID
,A.MANAGER_ID
,A.EMP_NAME
FROM RECURSIVE_TEST A
WHERE MANAGER_ID = 0
UNION ALL
SELECT A.EMP_ID
,A.MANAGER_ID
,A.EMP_NAME
FROM RECURSIVE_TEST A, T
WHERE A.MANAGER_ID = T.EMP_ID
)
SELECT * FROM T;

结果:

 emp_id | manager_id | emp_name 
--------+------------+----------
1 | 0 | MANAGER1
2 | 0 | MANAGER2
3 | 0 | MANAGER3
4 | 0 | MANAGER4
5 | 1 | emp1
6 | 3 | emp2
7 | 4 | emp3
8 | 2 | emp4
9 | 2 | emp5
10 | 3 | emp6
11 | 4 | emp7
12 | 3 | emp8
13 | 4 | emp9
14 | 2 | emp10
15 | 2 | emp11
16 | 1 | emp12

我想像下面那样对结果集进行排序。

 emp_id | manager_id | emp_name 
--------+------------+----------
1 | 0 | MANAGER1
5 | 1 | emp1
16 | 1 | emp12
2 | 0 | MANAGER2
8 | 2 | emp4
9 | 2 | emp5
14 | 2 | emp10
15 | 2 | emp11
3 | 0 | MANAGER3
6 | 3 | emp2
10 | 3 | emp6
12 | 3 | emp8
4 | 0 | MANAGER4
7 | 4 | emp3
11 | 4 | emp7
13 | 4 | emp9

有什么建议吗?

最佳答案

这将实现您所描述的:

对于层次结构的一个级别

WITH RECURSIVE t AS (
SELECT emp_id As top_id
, emp_id
, manager_id
, emp_name
FROM recursive_test
WHERE manager_id = 0

UNION ALL
SELECT t.top_id
, a.emp_id
, a.manager_id
, a.emp_name
FROM recursive_test a
JOIN t ON a.manager_id = t.emp_id
)
SELECT emp_id
, manager_id
, emp_name
FROM t
ORDER BY top_id, emp_id;

您似乎想按 emp_id secondary ..

对于任意数量的级别:

WITH RECURSIVE t AS (
SELECT ARRAY[emp_id] AS hierarchy
, emp_id
, manager_id
, emp_name
FROM recursive_test
WHERE manager_id = 0

UNION ALL
SELECT t.hierarchy || a.emp_id
, a.emp_id
, a.manager_id
, a.emp_name
FROM recursive_test a
JOIN t ON a.manager_id = t.emp_id
)
SELECT emp_id
, manager_id
, emp_name
FROM t
ORDER BY hierarchy;

这个将祖先(包括自己)收集到一个数组中并按它排序,实现类似于目录的排序。

按数组排序按预期工作。相关:

关于sql - 如何制作 ORDER SIBLINGS BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17737283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com