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