我試圖在 Oracle 中使用分層查詢來實作如下所述的結果,嘗試使用 CONNECT_BY_ROOT、CONNECT BY PRIOR 的各種方法,...但不知何故無法進入所需的結果。
CREATE TABLE test (
id int,
name varchar2(75),
parentid int,
class int
);
INSERT into test values (1, 'BOSS',null,null);
INSERT into test values (2, 'C1',1, 0);
INSERT into test values (34, 'C2',2, 1);
INSERT into test values (37, 'C3',34, 2);
INSERT into test values (50, 'C4',37, 2);
INSERT into test values (51, 'C5',50, 4);
INSERT into test values (100, 'C6',37, 4);
INSERT into test values (101, 'C7',37, 5);
在查詢中,如果我傳遞 'C4 的 id=50 和 class=4,那么它應該回傳它的孩子,即 C5(其 parentid 為 50),同時它還應該獲取 C6(因為這是 C4 的父母的孩子,即 C4 的父母是 C3,它有一個孩子 C6,即 parentid 37)
51 C5 50 -- This is Child of C4 i.e. C5's parent=50
100 C6 37 -- This is because C4 parent is C3 and in turn C3 has another child C6 of same class
我從一些基本查詢開始并做了一些更改以獲取所需的結果但沒有成功...我知道這是不正確的...并且遺漏了一些
SELECT distinct id, name, parentid
FROM test
CONNECT BY PRIOR id =parentid
START WITH id=50
order by 1 ;
(編輯文本)
SELECT
distinct id, name, parentid,
connect_by_root id ,
sys_connect_by_path(name,' > ') as full_path,
CONNECT_BY_ROOT id cbr,
CONNECT_BY_ISLEAF AS leaf
FROM test
CONNECT BY PRIOR id =parentid
START WITH id=50
order by 1 ;
(編輯文本) 預期輸出:
51 C5 50
100 C6 37
uj5u.com熱心網友回復:
這是一種解決方案:您需要在 connect by 子句中使用 nocycle 選項以使 oracle 在遇到回圈時停止。
select distinct ID, NAME, PARENTID
from test
where class = 4
start with name = 'C4'
connect by nocycle prior id = parentid or prior parentid = parentid
order by id
;
uj5u.com熱心網友回復:
如果要選擇使用簡單遞回 CTE的父級的所有直接或間接子級id = 50
with rec_cte (ID, NAME, PARENTID, CLASS) as (
select * from test
where parentid = (select parentid from test where id = 50)
union all
select test.ID, test.NAME, test.PARENTID, test.CLASS
from rec_cte
join test on rec_cte.id = test.parentid
)
select * from rec_cte
這按預期給出
ID NAME PARENTID CLASS
---------- ----- ---------- ----------
50 C4 37 2
100 C6 37 4
101 C7 37 5
51 C5 50 4
如果您想通過添加過濾謂詞將上述結果限制為記錄class = 4
with rec_cte (ID, NAME, PARENTID, CLASS) as (
select * from test
where parentid = (select parentid from test where id = 50)
union all
select test.ID, test.NAME, test.PARENTID, test.CLASS
from rec_cte
join test on rec_cte.id = test.parentid
)
select ID, NAME, PARENTID
from rec_cte
where class = 4
這會產生您期望的結果
ID NAME PARENTID
---------- ----- ----------
100 C6 37
51 C5 50
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338224.html
標籤:甲骨文
下一篇:回傳兩個字符之間的值
