F851, „ORDER BY in subqueries“


BigQueryDb2 (LUW)DuckDBH2MariaDBMySQLOracle DBPostgreSQLSQL ServerSQLite20052007200920112013201520172019202120232025✓ 3.5.7 - 3.53.0⚠ 2008R2 - 2025ab⚠ 8.3 - 18a✓ 11gR1 - 23.26.1✓ 5.0 - 9.7.0✓ 5.3 - 12.2.2c✓ 5.1 - 5.2⚠ 1.4.191 - 2.4.240a✓ 1.0.0 - 1.5.0✓ 9.7 - 12.1.4✓ 2.0+
  1. Einige Varianten
  2. Nur in Kombination mit fetch first oder ähnlichen Klauseln
  3. Wird weg optimiert, wenn bedeutungslos

Diese optionale SQL-Funktion deckt die Order By-Klausel in Unterabfragen ab:

SELECT c
  FROM (SELECT *
          FROM (VALUES (1), (2)) t(c)
         ORDER BY c
         FETCH FIRST 1 ROW ONLY
       ) t2

Beachte, dass der einzige Grund für eine Order By-Klausel in Unterabfragen darin besteht, eine Reihenfolge für die Offset- und Fetch First-Klauseln festzulegen – oder ähnliche nicht-standard Klauseln wie limit und top.

Varianten

Bei der Order By-Klausel kann man die folgenden Schlüsseltypen unterscheiden: ⓵ Spaltennamen der Select-Klausel; ⓶ Spaltennamen der From-Klausel0 und ⓷ Ausdrücke, die mindestens einen solchen Spaltennamen enthalten.1 Positionsnummern mittels positiver Ganzzahl ⓸ sind nicht mehr standard SQL. Obwohl der Standard Order By in Unterabfragen auch ohne offset oder fetch first erlaubt, gib es Systeme die so eine (sinnlose) Order By-Klausel nicht akzeptieren ⓹.

BigQuery 2026-05-12Db2 (LUW) 12.1.4DuckDB 1.5.0H2 2.4.240abMariaDB 12.2.2cMySQL 9.7.0cOracle DB 23.26.1PostgreSQL 18aSQL Server 2025adSQLite 3.53.0Select-Spaltennamen ⓵From-Spaltennamen ⓶Ausdrücke ⓷Positionsnummer ⓸Ohne fetch first, … ⓹
  1. Ausdrücke dürfen keine Select-Namen enthalten:
    select c AS x FROM (VALUES (1), (2)) t(c) ORDER BY x
  2. Auch als Bind-Parameter: order by ? • Negative Parameter (nicht aber Literale) kehren die Reihenfolge um
  3. Auch als Bind-Parameter: order by ?
  4. Zumutbar; Wird in den anderen Charts ignoriert

SQL Server erlaubt keine sinnlosen Order By-Klausen in Unterabfragen. MariaDB optimiert solche einfach weg – dieses Verhalten ist auch standard-konform, da die Reihenfolge von Unterabfragen in der äußeren Abfrage nicht erhalten bleibt.2

Normative Referenzen

F851, „ORDER BY in subqueries“ ist eine optionale Funktion in ISO/IEC 9075-2:2023. Sie erschien erstmals in der Ausgabe von 2008.

20 Jahre SQL-Evolution kann man nicht an einem Tag nachholen. Abonniere den Newsletter via E-Mail, Bluesky oder RSS, um sukzessive aufzuholen und modern-sql.com am Radar zu behalten.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Fußnoten

  1. Wenn die Abfrage weder union, except noch intersect nutzt (ISO/IEC 9075-2:2023 §7.17 SR 26di1).

  2. Aber keine Unterabfragen oder <set function specifications>

  3. ISO/IEC 9075-2:2023 §4.17.3: „The ordering of the rows of the table specified by the <query expression> is guaranteed only for the <query expression> that immediately contains the <order by clause>“

Neuigkeiten Abonnieren

Markus Winands MailinglistenMarkus Winands RSS-FeedMarkus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf MastodonMarkus Winand auf Bluesky
Copyright 2015-2026 Markus Winand. Alle Rechte vorbehalten.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO