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.
- 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