MS SQL 2005 - порядок с сополуностью с подзвезгом не удается
-
28-09-2019 - |
Вопрос
Это упрощенная версия настоящего запроса, чтобы показать проблему. Это может быть выполнено в примерной базе данных AdventureWorks:
SELECT Person.Address.*,
(SELECT TOP 1 [Name]
FROM Person.StateProvince
WHERE Person.StateProvince.StateProvinceId = Person.Address.StateProvinceId AND Person.StateProvince.TerritoryId IN (5, 6, 7)
ORDER BY Person.StateProvince.TerritoryId) AS [Name]
FROM Person.Address
ORDER BY [Name]
Это хорошо работает, но моя проблема в том, что если я добавлю сопоставление на порядок по полю, я получаю странное сообщение об ошибке:
SELECT Person.Address.*,
(SELECT TOP 1 [Name]
FROM Person.StateProvince
WHERE Person.StateProvince.StateProvinceId = Person.Address.StateProvinceId AND Person.StateProvince.TerritoryId IN (5, 6, 7)
ORDER BY Person.StateProvince.TerritoryId) AS [Name]
FROM Person.Address
ORDER BY [Name] COLLATE Chinese_PRC_CI_AI
И ошибка:
Msg 207, Level 16, State 1, Line 7
Invalid column name 'Name'.
Запрос с Collate Prose работает хорошо, если нет подзапроса, но мне нужно, чтобы это было похоже на это (для сложной причины, но, пожалуйста, поверьте мне :)).
Кто-нибудь знает, почему этот запрос терпит неудачу, а что может быть возможный обходной путь? Это ошибка?
Спасибо! Адам
Решение
SQL Server не позволяет ссылаться на столбцы с псевдонимами в пункте заказа. Например, это не будет работать:
select id+1 as x from MyTable order by x
Но вы можете исправить это, повторяя определение столбца:
select id+1 as x from MyTable order by id+1
Или используя подзапрос:
select * from (select id+1 as x from MyTable) as subquery order by x
В вашем случае лучшее исправление, вероятно, используется подзапрос:
SELECT *
FROM (
SELECT Person.Address.*
, (
SELECT TOP 1 [Name]
FROM Person.StateProvince
WHERE Person.StateProvince.StateProvinceId =
Person.Address.StateProvinceId
AND Person.StateProvince.TerritoryId IN (5, 6, 7)
ORDER BY
Person.StateProvince.TerritoryId
) AS [Name]
FROM Person.Address
) as SubqueryAlias
ORDER BY
[Name]