Почему не делает Oracle, SQL позволяет нам использовать псевдонимы столбца в пунктах GROUP BY?

Это - ситуация, с которой я обычно сталкиваюсь при записи SQL-запросов. Я думаю, что запись целого столбца (например, долгие case-выражения, функции суммы с длинными параметрами) вместо псевдонимов в выражениях GROUP BY делает запрос дольше и менее читаемый. Почему не делает Oracle, SQL позволяет нам использовать псевдонимы столбца в пункте GROUP BY? Должна быть важная причина позади него.

26
задан Mehper C. Palavuzlar 21 April 2010 в 09:01
поделиться

3 ответа

Это не просто 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
45
ответ дан 28 November 2019 в 06:32
поделиться

Но некоторые СУБД работают, это работает на 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 просто выбирает полное имя, полученное в результате этой группировки; хотя синтаксически это выглядит наоборот. Сначала всегда выполняется ГРУППА, а последними - проекции (т.е. ВЫБРАТЬ)

2
ответ дан 28 November 2019 в 06:32
поделиться

Хотя я согласен, что было бы полезно ссылаться на выражения с псевдонимами в предложении GROUP BY, я предполагаю, что это невозможно, потому что Предложение GROUP BY оценивается перед предложением SELECT.

Это также объясняет, почему вы можете использовать псевдонимы столбцов в предложении ORDER BY (т.е. предложение ORDER BY оценивается последним).

3
ответ дан 28 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: