[求助] start with connect by 奇怪的问题

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 编辑 ]
请使用浏览器的分享功能分享到微信等