ORDER BY-Elemente müssen in der Auswahlliste erscheinen […]

7

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 CASEAnweisung neben der ORDER BYKlausel 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
Evan Carroll
quelle
Sie können auch nicht nach Ordnungszahlen innerhalb eines Ausdrucks ordnen ( ORDER BY 1) und Ihre Beispielabfrage kann nicht erzeugt werden, foo = 2daher habe ich einige Vermutungen über die Absicht angestellt.
Martin Smith

Antworten:

12

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

SELECT A AS B
FROM   (VALUES (1, 3),
               (2, 2),
               (3, 1)) V(A, B)
ORDER  BY B

Rückgabe (sortiert nach Alias)

+---+
| B |
+---+
| 1 |
| 2 |
| 3 |
+---+

Aber

SELECT A AS B
FROM   (VALUES (1, 3),
               (2, 2),
               (3, 1)) V(A, B)
ORDER  BY B + 0 

Rückgabe (sortiert nach Basistabellenspalte B)

+---+
| B |
+---+
| 3 |
| 2 |
| 1 |
+---+

Sie können das Ganze natürlich einfach in eine abgeleitete Tabelle oder einen CTE einwickeln.

WITH T AS
(
SELECT 1 AS foo, 2 AS bar
UNION ALL
SELECT 10 AS foo, 20 AS bar
)
SELECT *
FROM T
ORDER BY CASE WHEN foo = 1 THEN bar END;
Martin Smith
quelle