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

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top