Bei Verwendung von Microsoft SQL Server 2008 wird der folgende Fehler angezeigt.
Nachricht 104, Ebene 16
, Status 1, Zeile 43 ORDER BY-Elemente müssen in der Auswahlliste angezeigt werden, wenn die Anweisung einen UNION-, INTERSECT- oder EXCEPT-Operator enthält.
Die Abfrage, die ich verwende, ist etwas komplex, aber die CASE
Anweisung neben der ORDER BY
Klausel kann den Namen der Alias-Spalte nicht sehen. Hier ist ein kurzes Beispiel.
SELECT 1 AS foo, 2 AS bar
UNION ALL
SELECT 10 AS foo, 20 AS bar
ORDER BY CASE WHEN foo = 2 THEN 1 END;
In meiner Produktionsabfrage muss die linke Abfrage nach der Spalte [360_set]
in der Tabelle sortiert werden , und die rechte Abfrage muss so sortiert werden, als ob sie [360_set]
null wäre.
Wie behebe ich diesen Fehler und warum generiert diese Syntax einen Fehler?
Hier ist die Versionsinfo,
Microsoft SQL Server Management Studio 10.0.5512.0
Microsoft Analysis Services Client Tools 10.0.5500.0
Microsoft Data Access Components (MDAC) 6.1.7601.17514
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 9.10.9200.16635
Microsoft .NET Framework 2.0.50727.5472
Operating System 6.1.7601
sql-server
sql-server-2008-r2
order-by
case
Evan Carroll
quelle
quelle
ORDER BY 1
) und Ihre Beispielabfrage kann nicht erzeugt werden,foo = 2
daher habe ich einige Vermutungen über die Absicht angestellt.Antworten:
Wenn ein Alias in einem verwendet wird
ORDER BY
, muss er alleine verwendet werden, nicht innerhalb eines Ausdrucks.Wenn innerhalb eines Ausdrucks versucht wird, ihn in eine Spalte in den Basistabellenquellen aufzulösen, nicht als Alias.
So zum Beispiel
Rückgabe (sortiert nach Alias)
Aber
Rückgabe (sortiert nach Basistabellenspalte
B
)Sie können das Ganze natürlich einfach in eine abgeleitete Tabelle oder einen CTE einwickeln.
quelle