Это - ситуация, с которой я обычно сталкиваюсь при записи SQL-запросов. Я думаю, что запись целого столбца (например, долгие case-выражения, функции суммы с длинными параметрами) вместо псевдонимов в выражениях GROUP BY делает запрос дольше и менее читаемый. Почему не делает Oracle, SQL позволяет нам использовать псевдонимы столбца в пункте GROUP BY? Должна быть важная причина позади него.
Это не просто Oracle SQL, на самом деле я считаю, что он соответствует стандарту ANSI SQL (хотя у меня нет ссылки на это). Причина в том, что предложение SELECT логически обрабатывается после предложения GROUP BY, поэтому на момент выполнения GROUP BY псевдонимы еще не существуют.
Возможно, этот несколько нелепый пример помогает прояснить проблему и двусмысленность, которую избегает SQL:
SQL> select job as sal, sum(sal) as job
2 from scott.emp
3 group by job;
SAL JOB
--------- ----------
ANALYST 6000
CLERK 4150
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
Но некоторые СУБД работают, это работает на PostgreSQL:
select emp.lastname || ' ' || emp.firstname as fullname, count(emp_work.*) as cnt
from emp
left join emp_work using(emp_id)
group by fullname
Это будет работать, пока сгруппированный псевдоним не является результатом агрегатных функций, группа cnt
не будет работать
Но я могу предположить, что группа по полному имени
расширяется до группы по emp.lastname || '' || emp.firstname как полное имя
, а предложение SELECT просто выбирает полное имя, полученное в результате этой группировки; хотя синтаксически это выглядит наоборот. Сначала всегда выполняется ГРУППА, а последними - проекции (т.е. ВЫБРАТЬ)
Хотя я согласен, что было бы полезно ссылаться на выражения с псевдонимами в предложении GROUP BY, я предполагаю, что это невозможно, потому что Предложение GROUP BY оценивается перед предложением SELECT.
Это также объясняет, почему вы можете использовать псевдонимы столбцов в предложении ORDER BY (т.е. предложение ORDER BY оценивается последним).