#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.
Комментариев нет:
Отправить комментарий