[求助] start with connect by 奇怪的問題

tolywang發表於2010-12-23
Oracle 10.2.0.5  64bit .  測試資料庫, 期間沒有任何資料增加及刪除 。


以下SQL 在toad中執行顯示出來的結果為 18 筆      (備註: 單獨執行藍色部分為213筆)   。


SELECT     a.ID, a.parent_id, a.name_en, a.name_zh_tw, a.name_zh_cn,
           a.seq, a.TYPE,
           a.description
      FROM

      (SELECT DISTINCT ID, app_id, parent_id, seq, name_en, name_zh_tw,
                            name_zh_cn, TYPE, description, action
                       FROM (SELECT     a.*
                                   FROM pf_access_node a
                                  WHERE a.active_flag = '1'
                                    AND a.app_id =
                                            '159CBB0D0AA1237700A61D644DF26DC0'
                             START WITH (   EXISTS (
                                               SELECT *
                                                 FROM pf_role_user b,
                                                      pf_role c,
                                                      pf_role_access d
                                                WHERE c.active_flag = '1'
                                                  AND b.role_id = c.ID
                                                  AND c.ID = d.role_id
                                                  AND b.user_id =
                                                         'EE95B4040AB5132B00F449B85F0F18B4'
                                                  AND d.access_node_id = a.ID)
                                         OR EXISTS (
                                               SELECT *
                                                 FROM pf_agent
                                                WHERE active_flag = '1'
                                                  AND agent_type = 'FUNC'
                                                  AND agent_id =
                                                         '9EEF6CDA0A86825101AFF012F9B905C1'
                                                  AND ref_id = a.ID
                                                  AND NVL (start_date,
                                                           SYSDATE) <= SYSDATE
                                                  AND NVL (end_date, SYSDATE) >=
                                                                       SYSDATE)
                                        )
                             CONNECT BY PRIOR a.ID = a.parent_id
                             UNION
                             SELECT     a.*
                                   FROM pf_access_node a
                                  WHERE a.active_flag = '1'
                                    AND a.app_id =
                                            '159CBB0D0AA1237700A61D644DF26DC0'
                             START WITH (   EXISTS (
                                               SELECT *
                                                 FROM pf_role_user b,
                                                      pf_role c,
                                                      pf_role_access d
                                                WHERE c.active_flag = '1'
                                                  AND b.role_id = c.ID
                                                  AND c.ID = d.role_id
                                                  AND b.user_id =
                                                         'EE95B4040AB5132B00F449B85F0F18B4'
                                                  AND d.access_node_id = a.ID)
                                         OR EXISTS (
                                               SELECT *
                                                 FROM pf_agent
                                                WHERE active_flag = '1'
                                                  AND agent_type = 'FUNC'
                                                  AND agent_id =
                                                         '9EEF6CDA0A86825101AFF012F9B905C1'
                                                  AND ref_id = a.ID
                                                  AND NVL (start_date,
                                                           SYSDATE) <= SYSDATE
                                                  AND NVL (end_date, SYSDATE) >=
                                                                       SYSDATE)
                                        )
                             CONNECT BY PRIOR a.parent_id = a.ID)
                   ORDER BY parent_id, seq) a

                  
WHERE 1 = 1   
START WITH a.parent_id IS NULL
CONNECT BY PRIOR a.ID = a.parent_id   






使用create table test as xxxx ;  方式將藍色部分值匯入到一個測試表test  。





然後使用如下語句將上面藍色部分替代為 test ,  結果查詢出來的結果為 213 筆 。

SELECT     a.ID, a.parent_id, a.name_en, a.name_zh_tw, a.name_zh_cn,
           a.seq, a.TYPE,
           a.description
      FROM

      (test)  a
                  
WHERE 1 = 1   
START WITH a.parent_id IS NULL
CONNECT BY PRIOR a.ID = a.parent_id




結果要同事幫忙匯入到9i 測試庫, 發現不管怎麼搞,結果都是一樣的, 213 筆 ,正確的。

[ 本帖最後由 tolywang 於 2010-12-23 09:13 編輯 ]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-682501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章