select with cross apply не возвращает ожидаемый результат - PullRequest
2 голосов
/ 06 февраля 2020
select
    *
from
    (select level l from dual connect by level <4) t cross apply
    (select tt.a from (
        select level a from dual connect by level < t.l ) tt )

возврат

L A
1 1
2 1
3 1

Но я ожидал

L A
2 1
3 1
3 2

, потому что

select level a from dual connect by level < 1 -> Null
select level a from dual connect by level < 2 -> 1
select level a from dual connect by level < 3 -> 1,2

1 Ответ

2 голосов
/ 06 февраля 2020

Ваш вопрос отражает очень распространенное недопонимание иерархических запросов. А именно:

Условие connect by применимо только к уровням 2 и выше. Если предложение start with отсутствует, уровень 1 будет всегда . Условия на уровне 1 приведены в предложении start with, а не в connect by.

Чтобы получить желаемый результат, вы должны добавить предложение start with с тем же условием (а именно, level < t.l ).

Однако, проверка измененного запроса приводит к ошибке; это вызвано корреляцией глубиной более одного уровня, которая действительно является проблемой, связанной с cross apply, а не с иерархическим битом.

EDIT - На самом деле кажется, что использование level в предложении start with также не работает должным образом. Я оставляю этот ответ, однако - объяснение того, почему ваши ожидания были неверны, все еще в силе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...