Предложение Oracle START WITH не возвращает корневых строк
Я выполняю следующий запрос в 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;
Это набор, возвращаемый внутренним выбором:
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
но если я запускаю его с предложением START WITH, запрос не возвращает строк, в то время как я ожидаю 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
Самые странные вещи:
- проблема возникает только в некоторых случаях, когда запрос работает в большинстве случаев без больших различий в значениях данных;
- если я создаю таблицу с результирующим набором внутреннего выбора, тот же запрос работает правильно, даже используя предложение START WITH.
Это запрос с использованием созданной таблицы:
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 не соответствует значению NULL в поле PARENT. Почему это происходит?
Заранее спасибо. С наилучшими пожеланиями.
1 ответ
Решение
Пожалуйста, попробуйте следующее. "Материализуйте" подсказку имеет значение.
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;