Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Это не просто 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

Ответ 2

Я знаю, что это старый поток, но проблема пользователей на самом деле не решена; объяснения были хорошими в объяснении, почему предложение 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-case, поэтому это хороший трюк.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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