Почему порядковые номера столбцов являются законными для 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 является (а) раздражающим и (б) делает ошибки во время обслуживания намного более вероятными. Вот простой пример:
SELECT DATEPART(YEAR,LastSeenOn), COUNT(*)
FROM Employee AS e
GROUP BY DATEPART(YEAR,LastSeenOn)
Я бы подумал, что правило SQL нормализовать только представлять данные один раз в базе данных также должно распространяться и на код. Я бы хотел, чтобы это выражение вычислялось только один раз (в списке столбцов SELECT
) и иметь возможность ссылаться на него по порядковому номеру в GROUP BY
.
Уточнение: я специально работаю над SQL Server 2008, но, тем не менее, я задаюсь вопросом об общем ответе.