Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Разница в количестве возвращаемых строк при явной и неявной группировке на пустой таблице

#sql #oracle #ansi #oracle18c


Ни для кого не секрет, что агрегатная функция на пустой таблице, например:

create table t1 (id number);

select count (1) from t1;


вернёт вернёт одну строчку:

  COUNT(1)
----------
         0


Как известно, здесь будет произведена неявная групировка с объединением всех записей
в одну общую группу. Согласно стандарту SQL, даже если результат такой группировки
не содержит ни одной строчки, он будет преобразован в одну строчку. Поэтому, результат
запроса выше объясним и широко известен.

Но можно задать глобальную группировку, т.е. без указания полей для группировки, явно:

select count (1) from t1 group by ();


и результат не совсем ожидаемый:


  no rows selected


Почему при явной группировке результат отличается? 
    


Ответы

Ответ 1



Возможность явной группировки без указания полей group by () была введена в стандарте SQL:1999 совместно с введением Grouping Sets. Реализована она была в версии 9iR1 в 2001 году. С тех пор, включая 12c, реализация была выполнена с отличающимся поведением при явной и неявной группировке. В актуальном стандарте SQL:2016-2 явно указано, что должна выполнятся синтаксическая трансформация с добавлением group by (), где требуется глобальная группировка, но group by явно не задан. В релизе 18c Oracle, без какого-либо упоминания в списке изменений или документации, изменил поведение явной глобальной групировки: 18c> select count (1) from t1 group by (); COUNT(1) ---------- 0 PS Вероятно, это можно разценить как желание более полного соответствия стандартам. Есть надежда, что дойдёт очередь и до других отклонений от стандарта, таких как - пустая строка интерпретируется как NULL.

Комментариев нет:

Отправить комментарий