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

Über den Autor

Foto von Markus Winand

Markus Winand lehrt effizientes SQL – inhouse und online. Er minimiert die Entwicklungszeit durch modernes SQL und optimiert die Laufzeit durch schlaue Indizierung – dazu hat er auch das Buch SQL Performance Explained veröffentlicht.

Sein Buch bei Amazon kaufen

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

Die Essenz: SQL-Tuning auf 200 Seiten

Bei Amazon kaufen
(Taschenbuch)

Taschenbuch und PDF auch auf Markus' Webseite erhältlich.

Sein Training

Sein beliebtes Training stimmt Entwickler auf SQL Performance ein.

Erfahren Sie mehr»

Fußnoten

0

SQL:2011, Part 1, §8.4 (frei Verfügbar von ISO). Auch in SQL-92, §23.3.

1

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

2

…oder proprietäre Funktionen wie Synonyme.

„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 | CC-BY-NC-ND 3.0 Lizenz