![](/img/trans.png)
[英]How to select all the hierarchy of a table with levels in PostgreSQL
[英]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.