Wie der erste Teil des Titels suggeriert, ist dies der Anfang einer Serie von SQL Tricks, die sich als praktisch erwiesen haben. Als Trick betrachte ich dabei alles was mit Oracle SQL Mitteln möglich ist, aber sicherlich nicht das primäre Ziel derjenigen war, die die Sprache entworfen haben.

Zur unendlichen Tabelle:

Viele Reports, aber auch andere Anwendungen verlangen immer wieder nach einer Tabelle, deren einziger Sinn auf der Welt es ist, eine bestimmte Anzahl Zeilen zu haben. Das bekannteste Beispiel im Oracle Universum ist die Tabelle dual mit genau einer Zeile. Der Inhalt der Zeile dabei völlig irrelevant.

Aber wenn es mehr als nur ein Datensatz sein soll? Zum Beispiel 7 für die Tage einer Woche, oder 365/366 für die Tage im Jahr? Ein weit verbreiteter Ansatz ist es eine große Tabelle (z.B. ALL_OBJECTS) zu nehmen und davon die ersten n Zeilen:

select rownum from all_objects where rownum <= 23

Aber was, wenn es mal richtig viele Zeilen werden sollen und ALL_OBJECTS nicht ausreicht, oder der aktuelle Benutzer keine Rechte auf ALL_OBJECTS hat? Oder wenn man die Irritation vermeiden möchte, die ein select auf ALL_OBJECT bei vielen auslößt?. Das folgende Statement sollte immer funktionieren und der Parameter (100) darf zumindestens seeehr groß werden:

select * from (select level x from dual connect by  level <=100)

Das Statement verbindet per hierarchischer Abfrage jeden Eintrag aus dual (also einen) mit jedem Eintrag aus (dual) also noch einem, und dass immer so weiter, bis 100 Zeilen erreicht sind. Das ganze ist als inner select verpackt, da ansonsten bei einigen Kombinationen von Datenbank und Client Tool die Liste voreilig abbricht, vermutlich auf Grund von Optimierungen, die Oracle mit dual macht. Der äußere Select ist nicht explizit notwendig, wenn das ganze in einem Join oder dergleichen verwendet wird.

Die anderen Teile dieser Serie findet ihr hier:

Verwendungen eines Indexes bei LIKE Abfragen

Intervall Join