Просто любопытно о синтаксисе SQL. Так что если у меня есть
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
Это было бы неправильно, потому что
GROUP BY itemName, FirstLetter
действительно должно быть
GROUP BY itemName, substring(itemName, 1,1)
Но почему мы не можем просто использовать первое для удобства?
Ответы:
SQL реализован так, как если бы запрос был выполнен в следующем порядке:
Для большинства систем реляционных баз данных этот порядок объясняет, какие имена (столбцы или псевдонимы) являются действительными, поскольку они должны быть введены на предыдущем шаге.
Таким образом, в Oracle и SQL Server нельзя использовать термин в предложении GROUP BY, который вы определяете в предложении SELECT, поскольку GROUP BY выполняется перед предложением SELECT.
Хотя есть исключения: MySQL и Postgres, кажется, обладают дополнительным умом, который позволяет это.
источник
GROUP BY substring(itemName, 1,1)
умна база данных, чтобы не снизить производительность при повторной обработке подстроки в предложении SELECT?sql_mode
не считая ONLY_FULL_GROUP_BY в битовой маске , Оптимизатор имеет шанс получить лучшие результаты при различном / различном использовании псевдонима вHAVING
предложении.Вы всегда можете использовать подзапрос, чтобы вы могли использовать псевдоним; Конечно, проверьте производительность (возможно, сервер БД будет работать одинаково, но никогда не повредит):
источник
По крайней мере, в PostgreSQL вы можете использовать номер столбца в наборе результатов в предложении GROUP BY:
Конечно, это становится проблемой, если вы делаете это в интерактивном режиме и редактируете запрос, чтобы изменить количество или порядок столбцов в результате. Но все равно.
источник
GROUP BY FirstLetter
разрешено в Postgresql. Для этого попробуйте запустить это в Postgresql: выберите подстроку (table_name, 1,2) в качестве tname из группы information_schema.tables по tnameGROUP BY
любое выражение, содержащее агрегатные функции или оконные функции, которые «очевидно» не работают.SQL Server не позволяет ссылаться на псевдоним в предложении GROUP BY из-за логического порядка обработки. Предложение GROUP BY обрабатывается перед предложением SELECT, поэтому псевдоним неизвестен при оценке предложения GROUP BY. Это также объясняет, почему вы можете использовать псевдоним в предложении ORDER BY.
Вот один из источников информации о этапах логической обработки SQL Server .
источник
Я не отвечаю, почему это так, но хотел показать способ обойти это ограничение в SQL Server, используя
CROSS APPLY
для создания псевдоним. Затем вы используете его вGROUP BY
предложении, например, так:источник
Внимание: использование псевдонима в Group By (для служб, которые его поддерживают, например, postgres) может привести к непредвиденным результатам. Например, если вы создаете псевдоним, который уже существует во внутреннем операторе, Group By выберет имя внутреннего поля.
источник
Некоторые СУБД позволяют использовать псевдоним вместо повторения всего выражения.
Teradata является одним из таких примеров.
Я избегаю обозначения порядкового номера, как это рекомендовано Биллом, по причинам, задокументированным в этом вопросе SO .
Простая и надежная альтернатива - всегда повторять выражение в предложении GROUP BY.
DRY НЕ применяется к SQL.
источник
Остерегайтесь использования псевдонимов при группировке результатов из представления в SQLite. Вы получите неожиданные результаты, если псевдоним совпадает с именем столбца любых базовых таблиц (для представлений).
источник
В тот день я обнаружил, что Rdb, прежний продукт DEC, теперь поддерживаемый Oracle, позволяет использовать псевдоним столбца в GROUP BY. Основная версия Oracle до версии 11 не позволяет использовать псевдоним столбца в GROUP BY. Не уверен, что Postgresql, SQL Server, MySQL и т. Д. Будут или не будут позволять. YMMV.
источник