2016-04-22 5 views
1

stieß ich auf eine Abfrage eine Dummy-Tabelle wie dieseCONNECT BY ohne vorherige

CREATE TABLE destination AS 
SELECT level AS id, 
     CASE 
     WHEN MOD(level, 2) = 0 THEN 10 
     ELSE 20 
     END AS status, 
     'Description of level ' || level AS description 
FROM dual 
CONNECT BY level <= 10; 

SELECT * FROM destination; 

     1   20 Description of level 1 
     2   10 Description of level 2 
     3   20 Description of level 3 
     4   10 Description of level 4 
     5   20 Description of level 5 
     6   10 Description of level 6 
     7   20 Description of level 7 
     8   10 Description of level 8 
     9   20 Description of level 9 
     10   10 Description of level 10 

10 rows selected. 

erstellen Könnten Sie einige Einsichten teilen, wie das funktioniert? Zuerst ist mir das Fehlen von PRIOR unbekannt. Zweitens verstehe ich nicht, wie der Baum aufgebaut ist. Von der Ebene aus sieht es so aus, als ob sie alle von derselben Wurzel ausgehen.

Antwort

4

Dieses Gimmick wurde von einem DB-Profi, Mikito Harakiri, bemerkt und auf AskTom geteilt. Es wurde in der Oracle-Community übernommen, obwohl es undokumentiert ist (es widerspricht der Dokumentation), und seine Verwendung ist insofern etwas gefährlich, als Oracle es irgendwann nicht mehr funktionieren lässt. (Obwohl es bereits sehr massiv ist, wäre es verrückt, dass Oracle es zurücknimmt.)

Die Zeilen sind tatsächlich von der gleichen Wurzel verzweigt, die einzelne Reihe von Dual. Sie können jede andere Tabelle verwenden, die GENAU EINE Reihe für den gleichen Trick hat. Wenn Sie mit zwei Zeilen beginnen (oder Sie verwenden den Trick auf Ihrer eigenen Tabelle mit vielen Zeilen), werden Sie schnell in Schwierigkeiten geraten. Es gibt Möglichkeiten, die Sie im Laufe der Zeit aufgreifen werden. Sie könnten daran interessiert sein, dem Oracle-Forum zu folgen, bei OTN, die Leute benutzen diesen Trick die ganze Zeit dort. Hier

ist ein Artikel, der diesen Trick diskutiert: http://www.sqlsnippets.com/en/topic-11821.html

+0

Ah treffen wir uns wieder, mein lieber mathguy. Sieht so aus, als sei dies Neuland von Oracle. – Kenny

+0

"undokumentiert"? Ich denke nicht. Werfen Sie einen Blick auf die Definition der "hierarchic_query_clause" [in der 11.1 SQL Ref] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#i2065646). 'CONNECT BY LEVEL <= 10' ist für die Beschreibung absolut gültig -' LEVEL <= 10' ist das 'condition'-Element des Ausdrucks. –

+0

@BobJarvis - Vielleicht hast du meinen Punkt verpasst? Lese den Titel des Threads, siehst du den "ohne PRIOR" -Teil? Was ich gesagt habe, wenn Sie meine Antwort noch einmal durchlesen, ist nicht nur "undokumentiert" - ich habe tatsächlich gesagt "GEGEN die Dokumentation". Oder ist Ihnen nicht bewusst, dass die dokumentierte Definition von hierarchischen Abfragen mindestens eine Bedingung in der CONNECT BY-Klausel erfordert, um den PRIOR-Operator zu verwenden? http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#i2053935 – mathguy

Verwandte Themen