4

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

编者注:这可能是指实际存在OracleORDER 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');

询问:

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

有什么建议吗?

4

1 回答 1

7

这将实现您所描述的:

对于一级层次结构

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次要订购..

对于任意数量的级别:

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;

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

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

于 2013-07-19T03:18:22.460 回答