Почему Oracle SQL не позволяет нам использовать псевдонимы столбцов в предложениях GROUP BY? - PullRequest
24 голосов
/ 21 апреля 2010

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

Ответы [ 5 ]

45 голосов
/ 21 апреля 2010

Это не просто 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
13 голосов
/ 19 апреля 2012

Я знаю, что это старая ветка, но кажется, что проблема пользователей не была действительно решена;объяснения были хороши при объяснении, почему предложение group by не позволяет использовать псевдонимы, но альтернативы не было.

Исходя из приведенной выше информации, псевдонимы не могут использоваться в группе, так как group by запускается первым до того, как псевдонимы из предложения select будут сохранены в памяти.Таким образом, простое решение, которое работало на мой взгляд, заключалось в добавлении внешнего выбора, который просто выбирает псевдонимы, а затем группирует на том же уровне.

Пример:

SELECT alias1, alias2, alias3, aliasN
FROM
(SELECT field1 as alias1, field2 as alias2, field3 as alias3, fieldN as aliasN
 FROM tableName
 WHERE ' ' = ' ')
GROUP BY alias1, alias2, alias3, aliasN

Довольно просто один развы видите решение, но PITA, если пытаетесь выяснить самостоятельно в первый раз.

Это единственный способ, которым я смог "сгруппировать" для производного поля из оператора case, так что этохороший трюк, чтобы знать.

3 голосов
/ 21 апреля 2010

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

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

2 голосов
/ 13 января 2011

Хотя это кажется логичным ответом, на самом деле это очень недружелюбный пользователь. Перед обработкой запроса Oracle читает его, и, прочитав его, препроцессор может заменить псевдоним исходным оператором и все же отправить правильный запрос в базу данных. так же, как вы можете кодировать порядок по 1,2,3, вы также сможете группировать по 1,2,3 или псевдониму.

1 голос
/ 21 апреля 2010

Но некоторые РСУБД делают, это работает на 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

Это будет работать, если сгруппированный псевдоним не является результатом агрегатных функций, group by cnt не будет работать

Но я могу рискнуть предположить, что group by fullname будет расширен до group by emp.lastname || ' ' || emp.firstname as fullname, а предложение SELECT просто выберет полное имя результата из этой группировки; хотя синтаксически это выглядит наоборот. Сначала всегда выполняется GROUP, а затем - проекции (т. Е. SELECT)

...