MS SQL 2005 - order by collate mit Unterabfrage schlägt fehl
-
28-09-2019 - |
Frage
Dies ist eine vereinfachte Version eines echten Abfrage das Problem zu zeigen. Es kann auf der Probe Adventureworks-Datenbank ausgeführt werden:
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]
Das funktioniert gut, aber mein Problem ist, dass wenn ich Kollation der Reihenfolge von Feld hinzufügen, ich eine seltsame Fehlermeldung:
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
Und der Fehler ist:
Msg 207, Level 16, State 1, Line 7
Invalid column name 'Name'.
Die Abfrage mit der Klausel collate funktioniert gut, wenn es keine Unterabfrage ist, aber ich muss es so sein (für einen komplizierten Grund, aber bitte glauben Sie mir:)).
Weiß jemand, warum diese Abfrage fehlschlägt, und was kann eine mögliche Abhilfe sein? Ist das ein Fehler?
Danke! Adam
Lösung
SQL Server ermöglicht es Ihnen nicht zu Spalten von Alias ??in der ORDER BY-Klausel zu beziehen. Zum Beispiel, das wird nicht funktionieren:
select id+1 as x from MyTable order by x
Aber man kann das Problem beheben, indem die Spaltendefinition zu wiederholen:
select id+1 as x from MyTable order by id+1
oder durch eine Unterabfrage:
select * from (select id+1 as x from MyTable) as subquery order by x
In Ihrem Fall die beste Lösung ist wahrscheinlich eine Unterabfrage zu verwenden:
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]