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_DATEVALUES (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.
- Proprietäre Erweiterung (nicht Standard!)
- Nur ohne Schlüsselwort
row - Nur mit Schlüsselwort
row:values row('r1c1','r1c2'), row('r2c1', 'r2c2') - Erfordert Spaltennamen in der
With-Klausel:with x (c1,c2) as (values …)• Nur ohne Schlüsselwortrow

