簡體   English   中英

Oracle SQL 中的分層數據

[英]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+ 行,想找到這些行不正確,有什么幫助嗎?

greatestleast函數可以用作

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 NOCYCLECONNECT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM