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 编辑 ]