Oracle-10g

遞歸管理器 - Oracle 10g x 11g

  • August 10, 2015

我們在將遞歸 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) 5CEO
  • 使用者程式碼 (CDUSER) 21經理 5領導)
  • 使用者程式碼 (CDUSER) 937領導者 21領導)
  • 使用者程式碼 (CDUSER) 1276開發者 937領導)

如果我在10g11g上搜尋領導者:

AND T.CDLEADER = 21

11g顯示了兩條記錄:

  • 937一個 (領隊
  • 1 個用於1276開發人員

10g只顯示了一條記錄:

  • 937一個 (領隊

SQL 小提琴範例

甲骨文的 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;

SQL小提琴

引用自:https://dba.stackexchange.com/questions/106804