Question

Ceci est une version simplifiée d'une véritable requête pour montrer le problème. Il peut être exécuté sur la base de données exemple 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]

Cela fonctionne bien, mais mon problème est que si j'ajoute la collation à l'ordre par le champ, je reçois un message d'erreur étrange:

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

Et l'erreur est:

Msg 207, Level 16, State 1, Line 7
Invalid column name 'Name'.

La requête avec la clause COLLATE fonctionne bien s'il n'y a pas sous-requête, mais je besoin d'être comme ça (pour une raison compliquée, mais s'il vous plaît, croyez-moi:).)

Quelqu'un sait-il pourquoi cette requête échoue, et ce qui peut être une solution possible? Est-ce un bug?

Merci! Adam

Était-ce utile?

La solution

SQL Server ne vous permet pas de se référer à des colonnes par alias dans l'ordre par article. Par exemple, cela ne fonctionnera pas:

select id+1 as x from MyTable order by x

Mais vous pouvez corriger cela en répétant la définition de la colonne:

select id+1 as x from MyTable order by id+1

Ou en utilisant un sous-requête:

select * from (select id+1 as x from MyTable) as subquery order by x

Dans votre cas, la meilleure solution est probablement d'utiliser une sous-requête:

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top