Domanda

Questa è una versione semplificata di una vera e propria query per mostrare il problema. Può essere eseguito sul database di esempio 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]

Questo funziona bene, ma il mio problema è che se aggiungo collazione all'ordine dal campo, ricevo un messaggio di errore strano:

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

E l'errore è:

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

La query con la clausola di fascicolazione funziona bene se non c'è subquery, ma ho bisogno di essere in questo modo (per un motivo complicato, ma per favore mi creda:)).

Qualcuno sa il motivo per cui questa query non riesce, e quello che può essere una possibile soluzione? Questo è un bug?

Grazie! Adam

È stato utile?

Soluzione

SQL Server non consente di fare riferimento a colonne alias nella clausola ORDER BY. Ad esempio, questo non funzionerà:

select id+1 as x from MyTable order by x

Ma si può risolvere che ripetendo la definizione di colonna:

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

o utilizzando un subquery:

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

Nel vostro caso, la migliore soluzione è probabilmente quello di utilizzare un subquery:

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top