Почему порядковые номера столбцов допустимы для ORDER BY
, но не для GROUP BY
? То есть, может ли кто-нибудь сказать мне, почему этот запрос
SELECT OrgUnitID, COUNT(*) FROM Employee AS e GROUP BY OrgUnitID
не может быть записан как
SELECT OrgUnitID, COUNT(*) FROM Employee AS e GROUP BY 1
Когда совершенно законно написать запрос наподобие
SELECT OrgUnitID FROM Employee AS e ORDER BY 1
?
Мне действительно интересно, есть ли что-то тонкое в реляционном исчислении, или что-то такое, что помешало бы правильной работе группировки.
Дело в том, что мой пример довольно тривиален. Обычно столбец, по которому я хочу сгруппировать, на самом деле является вычислением, и необходимость повторения точно такого же вычисления в GROUP BY является (a) раздражающей и (b) делает ошибки во время обслуживания намного более вероятными. Вот простой пример:
SELECT DATEPART(YEAR,LastSeenOn), COUNT(*)
FROM Employee AS e
GROUP BY DATEPART(YEAR,LastSeenOn)
Я думаю, что правило нормализации SQL для представления данных только один раз в базе данных должно распространяться и на код. Я хотел бы исправить это выражение только один раз (в списке столбцов SELECT ) и иметь возможность ссылаться на него по порядковому номеру в GROUP BY
.
Пояснение: Я специально работаю над SQL Server 2008, но все же задаюсь вопросом об общем ответе.