Oracle-10g
遞歸管理器 - Oracle 10g x 11g
我們在將遞歸 SQL 從11g調整為10g時遇到問題。
Oracle 11g查詢(按預期工作)
WITH ADRECURSIVEUSERLEADER (CDLEADER,CDUSER,NMUSER,FGUSERENABLED) AS ( SELECT US.CDLEADER AS CDLEADER ,US.CDUSER AS CDUSER ,US.NMUSER ,US.FGUSERENABLED FROM ADUSER US WHERE 1 = 1 UNION ALL SELECT RS.CDLEADER ,US.CDUSER ,US.NMUSER ,US.FGUSERENABLED FROM ADRECURSIVEUSERLEADER RS INNER JOIN ADUSER US ON RS.CDUSER = US.CDLEADER WHERE 1 = 1 ) SELECT * FROM ADRECURSIVEUSERLEADER T WHERE 1 = 1;
Oracle 10g查詢(我們正在嘗試)
WITH ADRECURSIVEUSERLEADER AS ( SELECT US.CDLEADER AS CDLEADER ,US.CDUSER AS CDUSER ,US.NMUSER ,US.FGUSERENABLED FROM ADUSER US START WITH US.CDLEADER IS NULL -- parent CONNECT BY PRIOR US.CDUSER = US.CDLEADER -- child / parent ) SELECT * FROM ADRECURSIVEUSERLEADER T WHERE 1 = 1;
問題是什麼?
我們有以下領導者結構:
- 使用者程式碼 (CDUSER) 5是CEO
- 使用者程式碼 (CDUSER) 21是經理 (由 5領導)
- 使用者程式碼 (CDUSER) 937是領導者 (由 21領導)
- 使用者程式碼 (CDUSER) 1276是開發者(由 937領導)
如果我在10g和11g上搜尋領導者:
AND T.CDLEADER = 21
11g顯示了兩條記錄:
- 937一個 (領隊)
- 1 個用於1276(開發人員)
10g只顯示了一條記錄:
- 937一個 (領隊)
甲骨文的 DDL:
CREATE TABLE ADUSER (CDUSER NUMBER(10) ,CDLEADER NUMBER(10) ,FGUSERENABLED NUMBER(2) ,NMUSER VARCHAR2(255) ); INSERT INTO ADUSER VALUES ( 5, NULL, 1, 'CEO Name'); INSERT INTO ADUSER VALUES ( 21, 5, 1, 'Manager Name'); INSERT INTO ADUSER VALUES ( 937, 21, 1, 'Leader Name'); INSERT INTO ADUSER VALUES (1276, 937, 1, 'Developer Name');
我需要的?
我需要知道我搜尋**的領導者下的每個人,**並且過濾器必須在 (ADRECURSIVEUSERLEADER T) 上應用,因為它將是一個視圖。這在 Oracle 10g 上可行嗎?
非常感謝
參考:甲骨文論壇
WITH ADRECURSIVEUSERLEADER AS ( SELECT CONNECT_BY_ROOT US.CDLEADER AS CDLEADER ,US.CDUSER AS CDUSER ,US.NMUSER ,US.FGUSERENABLED FROM ADUSER US CONNECT BY PRIOR US.CDUSER = US.CDLEADER -- child / parent ) SELECT * FROM ADRECURSIVEUSERLEADER T WHERE 1 = 1 order by cdleader, cduser;
如果你想找到“下”的人
CDLEADER = 21
,那為什麼要START WITH US.CDLEADER IS NULL
在你的CONNECT BY
?只需簡單地使用START WITH US.CDLEADER = 21
:WITH ADRECURSIVEUSERLEADER AS ( SELECT US.CDLEADER AS CDLEADER ,US.CDUSER AS CDUSER ,US.NMUSER ,US.FGUSERENABLED FROM ADUSER US START WITH US.CDLEADER = 21 -- parent CONNECT BY PRIOR US.CDUSER = US.CDLEADER -- child / parent ) SELECT * FROM ADRECURSIVEUSERLEADER T WHERE 1 = 1;