簡體   English   中英

按(父組,子組)和字母順序排序

[英]Order by (parent, child group) and values alphabetically

在這里發現了一個有趣的問題。

ResultID ParentID ValueX
--------------------------
1         0        GrandParent
2         1        Parent1
3         1        Parent2
4         2        Child1
5         2        Child2
6         3        Child3
7         3        Child4

我希望查詢結果集如下所示:

ResultID ParentID ValueX
--------------------------
1         0        GrandParent
2         1        Parent1
4         2        Child1
5         2        Child2
3         1        Parent2
6         3        Child3
7         3        Child4

如果ParentID為0,則表示它是主要類別。 如果ParentID大於0,則表示它是次要類別,是父級的子級。

因此,需要將父母按順序排列為AZ,將孩子按順序排列為AZ,並且在該組中,必須考慮按字母順序排序的值。 這不限於3個級別,並且可以持續到10個級別。

您能幫我正確訂購嗎?

WITH resultset (resultid, parentid, valuex) AS (
SELECT 1,0,'Grandparent' FROM dual UNION ALL
SELECT 2,1,'Parent1' FROM dual UNION ALL
SELECT 3,1,'Parent2' FROM dual UNION ALL
SELECT 4,2,'Child1' FROM dual UNION ALL
SELECT 5,2,'Child2' FROM dual UNION ALL
SELECT 6,3,'Child3' FROM dual UNION ALL
SELECT 7,3,'Child4' FROM dual )
SELECT ResultID , ParentID, ValueX
FROM resultset
ORDER BY ????

您可以使用遞歸cte創建路徑列表,以下是SQL Server語法,但是oracle應該類似:

;with cte AS (SELECT ResultID,ParentID,ValueX, List = CAST(ResultID AS VARCHAR(MAX))
              FROM #Table1
              WHERE ParentID = 0
              UNION ALL
              SELECT a.ResultID,a.ParentID,a.ValueX, List = b.List + ','+CAST(a.ResultID AS VARCHAR(MAX))
              FROM #Table1 a
              JOIN cte b
                ON a.ParentID = b.ResultID
                )
SELECT *
FROM cte
ORDER BY List

輸出:

ResultID    ParentID    ValueX      List
1           0           GrandParent 1
2           1           Parent1     1,2
4           2           Child1      1,2,4
5           2           Child2      1,2,5
3           1           Parent2     1,3
6           3           Child3      1,3,6
7           3           Child4      1,3,7

當然,您可以從“ SELECT列表中排除“ List ,然后依序進行排序。

您可以通過自連接來執行此操作,以從層次結構生成要排序的值列表,如下面的代碼所示。 我進行了擴展,在原始示例中添加了額外的層次結構,以顯示其工作方式。 顯然,這取決於了解層次結構級別的數量以生成合理的計划(例如,您始終可以執行10個級別,但是如果示例中只有3個層次結構,這將對性能造成很大的影響)。

再想一想,我想您可以使用EXEC語句生成特定層次結構級別所需的SQL,而不是按以下方式手動生成(這將進行一些優化,例如,我們知道某個條目在L3處沒有任何內容,那么它將不會。 L4也沒有任何東西)。

WITH resultset (resultid, parentid, valuex) AS (
SELECT 1,0,'Grandparent' UNION ALL
SELECT 2,1,'Parent1' UNION ALL
SELECT 3,1,'Parent2' UNION ALL
SELECT 4,2,'Child1' UNION ALL
SELECT 5,2,'Child2' UNION ALL
SELECT 6,3,'Child3' UNION ALL
SELECT 7,3,'Child4' UNION ALL
SELECT 8,4,'Child1_Child1' UNION ALL
SELECT 9,7,'Child4_Child1' UNION ALL
SELECT 10,6,'Child3_Child1')
SELECT l1.resultid , l1.parentid, l1.valuex, l2.resultid l2val, l3.resultid l3val,l4.resultid l4val,

-- rewrite COALESCE so clearer how this matches the pattern below
CASE WHEN l4.resultid IS NULL THEN
CASE WHEN l3.resultid IS NULL THEN
CASE WHEN l2.resultid IS NULL THEN l1.valuex 
ELSE l2.valuex END
ELSE l3.valuex END
ELSE l4.valuex END o1,

CASE WHEN l4.resultid IS NULL THEN 
CASE WHEN l3.resultid IS NULL THEN 
CASE WHEN l2.resultid IS NULL THEN '' 
ELSE l1.valuex END
ELSE COALESCE (l2.valuex, l1.valuex, '') END
ELSE COALESCE (l3.valuex, l2.valuex, l1.valuex, '') END o2,

CASE WHEN l3.resultid IS NULL THEN ''
WHEN l4.valuex IS NULL THEN l1.valuex
ELSE l2.valuex END o3,

CASE WHEN l2.valuex IS NULL THEN '' 
WHEN l4.valuex IS NULL THEN '' ELSE l1.valuex END o4

FROM resultset l1
left join resultset l2 on l1.parentid = l2.resultid
left join resultset l3 on l2.parentid = l3.resultid
left join resultset l4 on l3.parentid = l4.resultid
ORDER BY o1, o2, o3, o4

結果(為格式錯誤而道歉):

RESULTID    PARENTID    VALUEX          L2VAL   L3VAL   L4VAL   O1          O2      O3      O4
    1       0           Grandparent     (null)  (null)  (null)  Grandparent         
    2       1           Parent1         1       (null)  (null)  Grandparent Parent1     
    4       2           Child1          2       1       (null)  Grandparent Parent1 Child1  
    8       4           Child1_Child1   4       2       1       Grandparent Parent1 Child1  Child1_Child1
    5       2           Child2          2       1       (null)  Grandparent Parent1 Child2  
    3       1           Parent2         1       (null)  (null)  Grandparent Parent2     
    6       3           Child3          3       1       (null)  Grandparent Parent2 Child3  
    10      6           Child3_Child1   6       3       1       Grandparent Parent2 Child3  Child3_Child1
    7       3           Child4          3       1       (null)  Grandparent Parent2 Child4  
    9       7           Child4_Child1   7       3       1       Grandparent Parent2 Child4  Child4_Child1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM