ENTRY TABLE
__________________
| ID | PARENT_ID |
| 1 | null |
| 2 | 1 |
| 3 | 2 |
| 4 | null |
| 5 | 4 |
| 6 | 5 |
...
在某些情況下,我會復制條目,并且它們由父 ID 連接。
每個條目可以有一個副本:
THIS WONT HAPPEN
__________________
| ID | PARENT_ID |
| 1 | null |
| 2 | 1 |
| 3 | 1 |
...
有時我需要復制并查詢它的頂級父級。我需要為我搜索的所有條目找到頂部的父條目。
例如,如果我查詢 ID 6 和 3 的父母,我會得到 ID 4 和 1。如果我查詢 ID 5 和 2 的父母,我會得到 ID 4 和 1。但是如果我查詢 ID對于 5 和 1,它應該回傳 ID 4 和 1,因為條目 ID 1 已經是頂級父級本身。
我不知道從哪里開始,因為我不知道在這種情況下如何遞回查詢。
任何人都可以指出我正確的方向嗎?
我知道下面的查詢只會回傳子元素(ID 6 和 3),但老實說我不知道??從哪里開始。
順便說一下,我正在使用 OracleSQL。
SELECT * FROM entry WHERE id IN (6, 3);
uj5u.com熱心網友回復:
您可以使用分層查詢和CONNECT_BY_ROOT.
從層次結構的根開始并向下作業:
SELECT id,
CONNECT_BY_ROOT(id) AS root_id
FROM entry
WHERE id IN (6, 3)
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id;
或者,從條目回到根:
SELECT CONNECT_BY_ROOT(id) AS id,
id AS root_id
FROM entry
WHERE parent_id IS NULL
START WITH id IN (6, 3)
CONNECT BY PRIOR parent_id = id;
其中,對于樣本資料:
CREATE TABLE entry( id, parent_id ) AS
SELECT 1, NULL FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 3, 2 FROM DUAL UNION ALL
SELECT 4, NULL FROM DUAL UNION ALL
SELECT 5, 4 FROM DUAL UNION ALL
SELECT 6, 5 FROM DUAL UNION ALL
SELECT 7, 6 FROM DUAL
兩個輸出:
ID ROOT_ID 3 1 6 4
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以使用遞回 CTE 來遍歷圖形并找到初始父項。例如:
with
n (starting_id, current_id, parent_id, v) as (
select id, id, parent_id, 0 from entry where id in (6, 3)
union all
select n.starting_id, e.id, e.parent_id, n.v - 1
from n
join entry e on e.id = n.parent_id
)
select starting_id, current_id as initial_id
from (
select n.*, row_number() over(partition by starting_id order by v) as rn
from n
) x
where rn = 1
結果:
STARTING_ID INITIAL_ID
------------ ----------
3 1
6 4
請參閱db<>fiddle 上的運行示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371569.html
下一篇:沒有足夠的值選擇到表值中
