KIM*_*KIM 3 sql postgresql sql-order-by common-table-expression
我正在使用PostgreSQL 9.1.6并尝试构建递归SQL。
我想排序就像ORDER SIBLINGS BY在SQL Server中那样。
编者按:这可能是应该指甲骨文,那里ORDER SIBLINGS BY确实存在。
测试表:
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');
Run Code Online (Sandbox Code Playgroud)
查询:
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;
Run Code Online (Sandbox Code Playgroud)
结果:
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');
Run Code Online (Sandbox Code Playgroud)
我想像下面那样对结果集进行排序。
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;
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
这将实现您所描述的:
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;
Run Code Online (Sandbox Code Playgroud)
看来您想按次订购emp_id..
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;
Run Code Online (Sandbox Code Playgroud)
这将祖先(包括自身)收集到一个数组中并进行排序,从而实现像目录中那样的排序。
按数组排序按预期工作。有关:
| 归档时间: |
|
| 查看次数: |
4800 次 |
| 最近记录: |