MS SQL 2005 - порядок с сополуностью с подзвезгом не удается

StackOverflow https://stackoverflow.com/questions/4086804

  •  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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top