我正在處理資料庫中的 postgres,我們在下表中列出了用于存盤層次結構 ID的PATH列。ltree
表(位置)-
| ID(PK) | User |PATH (parent hierarchy) |
|--------|----------|---------|
| 1 | Parent | null |
| 2 | Child-1 | 1 |
| 3 | Child-2 | 1.2 |
| 4 | Child-3 | 1.2.3 |
| 5 | AParent | null |
| 6 | AChild-2| 5 |
| 7 | AChild-3| 5.6 |
| 8 | AChild-4| 5.6 |
嘗試以下查詢 -
select loc.user,STRING_TO_ARRAY(concat(loc.PATH::text,'.',loc.id),'.') as path
from location loc
WHERE LOC.NAME ilike '%child%';
結果 -
| ID | User | PATH |
|--------|----------|---------|
| 2 | Child-1 |{1,2} |
| 3 | Child-2 |{1,2,3} |
| 4 | Child-3 |{1,2,3,4}|
| 6 | AChild-2|{5,6} |
| 7 | AChild-3|{5,6,7} |
| 8 | AChild-4|{5,6,8} |
在這里你可以看到我們在表中有多個層次結構,但我想要唯一的層次結構直到葉子,例如
Hierarchy -1
A>B>C
Hierarchy -2
A>B>C>D`
預期結果應該是 -
A>B>C>D
因為 A>B>C 也屬于同一個保護傘。所以最終表的預期結果——
| ID | User | PATH |
|--------|----------|----------|
| 4 | Child-3 |{1,2,3,4} |
| 7 | AChild-3|{5,6,7} |
| 8 | Child-4 |{5,6,8} |
管理父子關系的表與顯示用戶層次結構的路徑相同。
如果還有其他需要,請告訴我。
uj5u.com熱心網友回復:
你可以通過檢查一個節點是否有任何后代來找到葉子:
select *
from location l1
where l1.path is not null
and not exists (
select from location l2
where l2.path <@ l1.path
and l2.path <> l1.path
)
order by l1.id
在db<>fiddle中測驗它。
查詢比它可能的更復雜,因為您的使用ltree有點不合邏輯。Roots 不應該是null,所有層次結構資訊都應該包含在ltree列中,而您不必將其與id.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/433981.html
標籤:sql PostgreSQL postgresql-11 ltree
上一篇:離子選擇未顯示反應形式的選定值
下一篇:如何更改查詢以檢查表是否為空
