簡體   English   中英

如何通過返回所有層次結構級別的select語句中的分支來訂購層次結構樹?

[英]How can I order hierarchy trees by branch in a select statement returning all hierarchy levels?

這是我目前的SQL:

SELECT filter_id, parent_id, level_id, match 
FROM t_filters
ORDER BY level_id;  

它顯示以下內容:

ID      PARENT  RANK    FILTER VALUE
10004           1       HQ
10002           1       Finance
10006           1       IT
10003   10006   2       HQ - Central
10005   10004   2       HQ - Non Core & Legacy
10001   10005   3       Non Core

我在這里的第一次嘗試通過hierarchy_level_id命令記錄,這基本上是排名。

請注意,父字段為空,其中記錄位於層次結構的頂部。

此外,分支可以具有1到8個條目的任何長度(8是當前最大值,但理論上可以增加1或2)。

我想要展示的是以下內容,它應該使用父字段來整理層次結構的各個分支:

ID      PARENT  RANK    FILTER VALUE
10004           1       HQ
10005   10004   2       HQ - Non Core & Legacy
10001   10005   3       Non Core
10002           1       Finance
10006           1       IT
10003   10006   2       HQ - Central

以下解決方案按id排序兄弟姐妹。 在你的評論中,你提到想要通過(過濾) value來訂購兄弟姐妹。 只需替換相關表達式即可實現此目的。

使用遞歸SQL,Oracle語法:

SELECT *
FROM t_filters
START WITH parent IS NULL
CONNECT BY parent = PRIOR id
ORDER SIBLINGS BY id

或者,SQL標准語法(標准和一些數據庫需要RECURSIVE關鍵字,但Oracle不允許)。 更乏味,但更具可擴展性:

WITH /* RECURSIVE */ r (id, parent, rank, value, path) AS (
  SELECT id, parent, rank, value, '' || id
  FROM t_filters
  WHERE parent IS NULL

  UNION ALL

  SELECT f.id, f.parent, f.rank, f.value, r.path || '/' || f.id
  FROM r
  JOIN t_filters f ON r.id = f.parent
)
SELECT *
FROM r
ORDER BY path

暫無
暫無

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

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