перекрестное применение ведет себя странно при использовании с группой - PullRequest
1 голос
/ 03 июля 2019

Я не понимаю, почему столбцы correct и incorrect имеют разные значения в этом случае.Если честно - кажется странным, что это действительный SQL, потому что часть cross apply не является функцией агрегирования, вычисленной из-за group by.

with Foo as (
    select 1 as id, 'foo_1' as txt from Dual union all
    select 2, 'foo_2' from Dual),
Bar as (
    select 1 as id, 'bar_1' as txt, 1 as foo_id from Dual union all
    select 2, 'bar_2', 1 from Dual union all
    select 3, 'bar_3', 1 from Dual union all
    select 4, 'bar_4', 2 from Dual)
select 
    f.id,
    listagg(b.txt, ', ') within group (order by b.id) as correct,
    incorrect
from Foo f
join Bar b on f.id = b.foo_id
cross apply (
    select 
        listagg(txt, ', ') within group (order by id) as incorrect
    from Bar 
    where foo_id = f.id)
group by f.id
order by f.id;

Результат:

ID  CORRECT                 INCORRECT
1   bar_1, bar_2, bar_3     bar_4
2   bar_4                   bar_4

Но когда я удаляю часть group by и добавляю distinct, как показано ниже:

with Foo as (
    select 1 as id, 'foo_1' as txt from Dual union all
    select 2, 'foo_2' from Dual),
Bar as (
    select 1 as id, 'bar_1' as txt, 1 as foo_id from Dual union all
    select 2, 'bar_2', 1 from Dual union all
    select 3, 'bar_3', 1 from Dual union all
    select 4, 'bar_4', 2 from Dual)
select distinct
    f.id,
    incorrect_now_correct
from Foo f
join Bar b on f.id = b.foo_id
cross apply (
    select 
        listagg(txt, ', ') within group (order by id) as incorrect_now_correct
    from Bar 
    where foo_id = f.id)
order by f.id;

Я получаю следующий результат:

ID  INCORRECT_NOW_CORRECT
1   bar_1, bar_2, bar_3
2   bar_4

Какиеявляется ли результат, ожидаемый от столбца incorrect в первом запросе.

Описывается ли предложение group by по-разному при использовании предложения group by?До сих пор я только думал, что это нечто большее, чем интеллектуальное соединение с подзапросом.Добавление incorrect к части group by заставляет его работать так, как должно, без него поведение аналогично описанному в результате первого запроса.Он компилирует, запускает и возвращает случайное значение.

Редактировать: Версия БД Oracle Database 12c Enterprise Edition 12.1.0.2.0

...