[英]Hierarchical Data In Oracle SQL
我在 Oracle SQL 中有這樣的 tbl_parent,示例數據如下:
Id(primary key) parentid childid
1 1 2
2 1 3
3 2 1
4 3 1 -- This row is wrong
在上表中,一些行被錯誤插入,例如,如果parent_id
1 有child_id
3 那么parent_id
3 不應該有child_id
1 因為 3 已經是 1 的孩子所以不能是父母,我有 5000+ 行,想找到這些行不正確,有什么幫助嗎?
greatest
和least
函數可以用作
select least(parentid,childid) as least_par_chi_id,
greatest(parentid,childid) as greatest_par_chi_id
from tab
group by greatest(parentid,childid), least(parentid,childid)
having count(*)>1;
基本上,您正在尋找表中的周期。
在分層查詢中識別循環的 Oracle 功能是
CONNECT BY NOCYCLE
和CONNECT_BY_ISCYCLE
此查詢顯示導致循環的所有節點 - 列is_Cycle = 1
select tbl.* ,
CONNECT_BY_ISCYCLE is_Cycle,
SYS_CONNECT_BY_PATH(childid, '/') path
from tbl
CONNECT BY NOCYCLE PRIOR childid = parentid
對於您的數據,結果是
PARENTID CHILDID IS_CYCLE PATH
---------- ---------- ---------- ----------
1 2 0 /2
2 1 1 /2/1
1 3 1 /2/1/3
1 3 0 /3
3 1 1 /3/1
1 2 1 /3/1/2
2 1 0 /1
1 2 1 /1/2
1 3 1 /1/3
3 1 0 /1
1 2 1 /1/2
1 3 1 /1/3
請注意,每個循環都在多個位置被識別,因此您會獲得一些冗余數據。
這種方法的優點是,它也適用於更長的周期(簡單的 GROUP BY 方法失敗了)。
長度為 3 的循環示例:
create table tbl as
select 1 parentid, 2 childid from dual union all
select 2 parentid, 3 childid from dual union all
select 3 parentid, 1 childid from dual;
PARENTID CHILDID IS_CYCLE PATH
---------- ---------- ---------- ----------
1 2 0 /2
2 3 0 /2/3
3 1 1 /2/3/1
2 3 0 /3
3 1 0 /3/1
1 2 1 /3/1/2
3 1 0 /1
1 2 0 /1/2
2 3 1 /1/2/3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.