2017-05-04 92 views
0

我目前正在导出查询从Oracle到PostgreSQL,和我被困在这一个是用来目录排序:PostgreSQL的:按名称顺序多层次结构后排序

WITH RECURSIVE R AS (
    SELECT ARRAY[ID] AS H 
     ,ID 
     ,PARENTID 
     ,NAME 
     ,1 AS level 
    FROM REPERTORIES 
    WHERE ID= (SELECT Min(ID) FROM REPERTORIES) 

    UNION ALL 
    SELECT R.H || A.ID 
     ,A.ID 
     ,A.PARENTID 
     ,A.NAME 
     ,R.level + 1 
    FROM REPERTORIES A 
    JOIN R ON A.PARENTID = R.ID 
    ) 
SELECT NAME 
     ,ID 
     ,PARENTID 
     , level 
FROM R 
    ORDER BY H 

它的部分工作,每个子目录都放在他的父目录或共享相同父目录的目录之后(一个目录可以有子目录,子目录也有子目录等等)

但我还需要排序处于同一级别的目录他们的名字(当然,他们的子目录在他们的旁边)

我该如何做到这一点?

在此先感谢(如果我的英语又硬又遗憾地理解)

编辑:这里是orignial Oracle查询:

SELECT NAME, ID, PARENTID, level 
FROM REPERTORIES 
CONNECT BY PRIOR ID = PARENTID 
START WITH ID = (SELECT Min(ID) FROM REPERTORIES) 
ORDER SIBLINGS BY NAME 

回答

0

“顺序由H”是扔我一个循环,但是.. 一般来说,您需要在查询的递归部分进行排序,以保持它们正确分组。

WITH RECURSIVE R AS (
    SELECT ARRAY[ID] AS H 
     ,ID 
     ,PARENTID 
     ,NAME 
     ,1 AS level 
    FROM REPERTORIES 
    WHERE ID= (SELECT Min(ID) FROM REPERTORIES) 

    UNION ALL 
    SELECT R.H || A.ID 
     ,A.ID 
     ,A.PARENTID 
     ,A.NAME 
     ,R.level + 1 
    FROM REPERTORIES A 
    JOIN R ON A.PARENTID = R.ID 
    order by name 
    ) 
SELECT NAME 
     ,ID 
     ,PARENTID 
     , level 
FROM R 
+1

它说我“在递归查询ORDER BY没有植入”,我试图这样做:/ – Dryster

1

你构建h,构建包含由路径名称和顺序的排列方式相似。

+0

Thnks,我要试试这个! – Dryster