select ohne from


Eines möchte ich gleich klarstellen: select ohne from ist nicht standard-konform.

Dennoch funktioniert es in vielen Datenbanken – auch in standard-konformen. Das ist kein Widerspruch: der Standard erlaubt es konformen Datenbanken ausdrücklich auch nicht-konforme Anweisungen zu verarbeiten0. Das Verhalten solcher Anweisung ist dann natürlich alleine dem Hersteller überlassen.

Welche Alternative bietet der Standard also zu select ohne from? Eine überraschend einfache, aber dennoch mächtige: values ohne insert.

Die folgende select-Anweisung kann also standard-konform als values ohne insert umgesetzt werden:

SELECT CURRENT_DATE
VALUES (CURRENT_DATE)

Schade eigentlich, dass diese Nutzung von values noch immer nicht in Kern-SQL ist. Die Folge ist, dass nur drei der sechs getesteten Datenbanken values in dieser Form unterstützen. select ohne from funktioniert jedoch bei vier der getesteten Datenbanken.

Natürlich muss man sich jetzt Fragen, was der Vorteil der values-Anweisung gegenüber select ohne from ist. Wie schon angedeutet, kann values etwas, das select ohne from nicht kann: mehrere Zeilen erzeugen.

Die folgende values-Anweisung liefert zum Beispiel das heutige und gestrige Datum in zwei Zeilen zurück – nicht in zwei Spalten:

VALUES (CURRENT_DATE)
     , (CURRENT_DATE - INTERVAL '1' DAY)

Mit select ohne from muss man dafür auf union zurückgreifen. Das kann schnell sperrig werden.

Konforme Alternativen

Eine konforme Variante bietet SQL Server: values ist dort in der from-Klausel erlaubt, wenn in der from-Klausel auch Spaltennamen zugewiesen werden.

SELECT *
  FROM (VALUES (1,2)
             , (3,4)
       ) t1 (c1, c2)

Ansonsten ist die einzige standard-konforme Alternative, eine Dummy-Tabelle zu verwenden. Datenbanken, die select ohne from nicht unterstützen, liefern diese in der Regel selbst mit (z.B. DUAL bei Oracle oder SYSIBM.DUMMY1 bei DB2). Außer der Portabilität spricht nichts gegen die Nutzung dieser Tabellen.

Um eine standard-konforme und portable Lösung zu erhalten, liefert man am einfachsten seine eigene Dummy-Tabelle1 mit seiner Software aus.

Falls nichts dagegen spricht, für jede Zeildatenbank eigene create-Anweisungen zu verwenden, kann man auch views2 anlegen, die auf die proprietären Dummy-Tabellen zugreifen. Damit kann man sich eventuell eine Diskussion über Performance ersparen, wenn die Dummy-Tabelle des Herstellers besonders performant ist. Das kann natürlich auch nach hinten losgehen.

Kompatibilität

Unterm Strich ist dieses Thema vor allem ein peinliches Armutszeugnis für die spärliche Adaption des Standards. Es liegt jedoch an uns, diese SQL-92-Funktion von den Datenbankherstellern einzufordern.

BigQueryabDb2 (LUW)bbbdMariaDBabbbbMySQLacccOracle DBPostgreSQLabbbbSQL ServerabbSQLiteabbbbselect ohne fromMehrzeilen insert … valuesValues als eigene AnweisungFrom|Join (values …) tWith t as (values …)
  1. Proprietäre Erweiterung (nicht Standard!)
  2. Nur ohne Schlüsselwort row
  3. Nur mit Schlüsselwort row: values row('r1c1','r1c2'), row('r2c1', 'r2c2')
  4. Erfordert Spaltennamen in der With-Klausel: with x (c1,c2) as (values …) • Nur ohne Schlüsselwort row

Ü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. SQL:2011, Part 1, §8.4 (frei Verfügbar von ISO). Auch in SQL-92, §23.3.

  2. Oder „Auxiliary-Tablle“, wie Joe Celko sagen würde.

  3. …oder proprietäre Funktionen wie Synonyme.

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„modern SQL“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO | CC-BY-NC-ND 3.0 Lizenz