MS SQL 2005 - порядок сортировки с подзапросом завершается неудачно - PullRequest
0 голосов
/ 03 ноября 2010

Это упрощенная версия реального запроса, чтобы показать проблему.Это может быть выполнено в примере базы данных 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 хорошо работает, если нет подзапроса, но мне нужно, чтобы он был таким (по сложной причине, но, пожалуйста, поверьте мне:)).

Кто-нибудь знает, почему этот запрос не выполняется и что может быть возможным обходным путем?Это ошибка?

Спасибо!Адам

1 Ответ

2 голосов
/ 03 ноября 2010

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]
...