Oracle START WITH 子句 returns 没有根行
Oracle START WITH clause returns no root rows
我在 Oracle 10g 中执行以下查询以分层形式检索数据(完整的查询有点复杂):
SELECT LEVEL AS lvl, a.*
FROM (
WITH temp
AS (...)
SELECT id_request, subj_type, id_subj, name, flag_e,
person_code, assoc_type, nature, parent
FROM temp,
(...)
) a
START WITH a.parent IS NULL
CONNECT BY PRIOR a.id_subj = a.parent;
这是内层返回的集合select:
ID_REQUEST SUBJ_TYPE ID_SUBJ NAME FLAG_E PERSON_CODE ASSOC_TYPE NATURE PARENT
91948 F 4A4BE76C44D4003CE0530AA000A6003C John Smith 0 xxxyyy123456zzzzz Declarant F NULL
91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
如果我 运行 整个查询 没有 START WITH 子句,我会正确地得到以下结果:
LVL ID_REQUEST SUBJ_TYPE ID_SUBJ NAME FLAG_E PERSON_CODE ASSOC_TYPE NATURE PARENT
1 91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
1 91948 F 4A4BE76C44D4003CE0530AA000A6003C John Smith 0 xxxyyy123456zzzzz Declarant F NULL
2 91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
但是如果我运行它with START WITH子句查询returns没有行而我期望2行:
LVL ID_REQUEST SUBJ_TYPE ID_SUBJ NAME FLAG_E PERSON_CODE ASSOC_TYPE NATURE PARENT
1 91948 F 4A4BE76C44D4003CE0530AA000A6003C John Smith 0 xxxyyy123456zzzzz Declarant F NULL
2 91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
最奇怪的是:
- 问题仅在某些情况下出现,而查询适用于大多数情况,数据值没有太大差异;
- 如果我使用内部 select 的结果集创建 table,即使使用 START WITH 子句,相同的查询也能正常工作。
这是使用 table 创建的查询:
select LEVEL as lvl, a.*
from (select * from test_tbl) a
start with a.parent is null
connect by PRIOR a.id_subj = a.parent;
START WITH 子句似乎与 PARENT 字段中的 NULL 值不匹配。为什么会这样?
提前致谢。
最好的问候。
请尝试以下操作。 "Materialize" 提示很重要。
WITH
temp AS (...),
a as (
SELECT /*+ materialize */ id_request, subj_type, id_subj, name, flag_e,
person_code, assoc_type, nature, parent
FROM temp,
(...)
)
SELECT LEVEL AS lvl, a.*
FROM a
START WITH a.parent IS NULL
CONNECT BY PRIOR a.id_subj = a.parent;
我在 Oracle 10g 中执行以下查询以分层形式检索数据(完整的查询有点复杂):
SELECT LEVEL AS lvl, a.*
FROM (
WITH temp
AS (...)
SELECT id_request, subj_type, id_subj, name, flag_e,
person_code, assoc_type, nature, parent
FROM temp,
(...)
) a
START WITH a.parent IS NULL
CONNECT BY PRIOR a.id_subj = a.parent;
这是内层返回的集合select:
ID_REQUEST SUBJ_TYPE ID_SUBJ NAME FLAG_E PERSON_CODE ASSOC_TYPE NATURE PARENT
91948 F 4A4BE76C44D4003CE0530AA000A6003C John Smith 0 xxxyyy123456zzzzz Declarant F NULL
91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
如果我 运行 整个查询 没有 START WITH 子句,我会正确地得到以下结果:
LVL ID_REQUEST SUBJ_TYPE ID_SUBJ NAME FLAG_E PERSON_CODE ASSOC_TYPE NATURE PARENT
1 91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
1 91948 F 4A4BE76C44D4003CE0530AA000A6003C John Smith 0 xxxyyy123456zzzzz Declarant F NULL
2 91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
但是如果我运行它with START WITH子句查询returns没有行而我期望2行:
LVL ID_REQUEST SUBJ_TYPE ID_SUBJ NAME FLAG_E PERSON_CODE ASSOC_TYPE NATURE PARENT
1 91948 F 4A4BE76C44D4003CE0530AA000A6003C John Smith 0 xxxyyy123456zzzzz Declarant F NULL
2 91948 C 4A4BE76C44D6003CE0530AA000A6003C Rose Anderson 0 kkkkkk654321qqqqq NULL F 4A4BE76C44D4003CE0530AA000A6003C
最奇怪的是:
- 问题仅在某些情况下出现,而查询适用于大多数情况,数据值没有太大差异;
- 如果我使用内部 select 的结果集创建 table,即使使用 START WITH 子句,相同的查询也能正常工作。
这是使用 table 创建的查询:
select LEVEL as lvl, a.*
from (select * from test_tbl) a
start with a.parent is null
connect by PRIOR a.id_subj = a.parent;
START WITH 子句似乎与 PARENT 字段中的 NULL 值不匹配。为什么会这样?
提前致谢。 最好的问候。
请尝试以下操作。 "Materialize" 提示很重要。
WITH
temp AS (...),
a as (
SELECT /*+ materialize */ id_request, subj_type, id_subj, name, flag_e,
person_code, assoc_type, nature, parent
FROM temp,
(...)
)
SELECT LEVEL AS lvl, a.*
FROM a
START WITH a.parent IS NULL
CONNECT BY PRIOR a.id_subj = a.parent;