MS SQL 2005 - order by fascicolazione con subquery non riesce
-
28-09-2019 - |
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
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]