Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何订购?_Sql_Postgresql_Sql Order By_Common Table Expression - Fatal编程技术网

Sql 如何订购?

Sql 如何订购?,sql,postgresql,sql-order-by,common-table-expression,Sql,Postgresql,Sql Order By,Common Table Expression,我正在使用PostgreSQL 9.1.6并尝试构建递归SQL。 我想在SQL Server中按排序兄弟姐妹 编者按:这可能是指Oracle 测试表: 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 ,'M

我正在使用PostgreSQL 9.1.6并尝试构建递归SQL。
我想在SQL Server中按
排序兄弟姐妹

编者按:这可能是指Oracle

测试表:

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|u id |经理| emp|u name
--------+------------+----------
1 | 0 |经理1
2 | 0 |经理2
3 | 0 |经理3
4 | 0 |经理4
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|u id |经理| emp|u name
--------+------------+----------
1 | 0 |经理1
5 | 1 | emp1
16 | 1 | emp12
2 | 0 |经理2
8 | 2 | emp4
9 | 2 | emp5
14 | 2 | emp10
15 | 2 | emp11
3 | 0 |经理3
6 | 3 | emp2
10 | 3 | emp6
12 | 3 | emp8
4 | 0 |经理4
7 | 4 | emp3
11 | 4 | emp7
13 | 4 | emp9

有什么建议吗?

这将实现您所描述的:

对于一个层次结构级别 您似乎想按
emp\u id
secondary.订购

对于任意数量的级别: 这一个收集数组中的祖先(包括自我)并按其排序,实现了目录中的排序

按数组排序的工作方式与预期相同。相关的:


也许你应该展示你的陈述、模式、PostgreSQL版本,向那些不了解Oracle查询语言的人解释
顺序排列兄弟姐妹的内容,等等。我已经给你这个建议很多次了,我不知道你为什么一直发布这么少的问题。现在,问题很好。其实很有趣+1迪托。谢谢你把它修好。顺便说一句,9.1.6有一个严重的安全漏洞;请看@CraigRinger:既然您觉得Q的更新令人满意,那么您可能会对Q感兴趣。好吧,现在它已经关闭了,只剩下“重新打开”了。@ErwinBrandstetter是的,非常感兴趣。我一直很恼火,closevote对话框是根据问题的当前状态构建的,暗示它可能会有所改进,但没有办法收回closevote或投票反对closevote。
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;
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;