Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle Connect BY के साथ भ्रम

कैसे एक CONNECT BY क्वेरी निष्पादित और मूल्यांकन किया जाता है - चरण दर चरण (उदाहरण के लिए)।

मान लें कि हमारे पास निम्न तालिका है और क्वेरी द्वारा कनेक्ट है:

select * from mytable;

         X
----------
         1 
         2 
         3 
         4 

SELECT level, m.* 
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x  OR  PRIOR x + 2 = x 
ORDER BY level;

चरण 1:

तालिका से पंक्तियों का चयन करें mytable जो एक START WITH . से मिलता है शर्त, लौटाए गए परिणाम सेट में LEVEL =1 असाइन करें:

 CREATE TABLE step1 AS
 SELECT 1 "LEVEL", X from mytable
 WHERE x = 1;

 SELECT * FROM step1;

         LEVEL          X
    ---------- ----------
             1          1

चरण 2

स्तर 1 से बढ़ाएँ:

LEVEL = LEVEL + 1

mytable . के साथ पिछले चरण में लौटाए गए परिणाम सेट में शामिल हों CONNECT BY . का उपयोग करके शामिल होने की शर्तों के रूप में शर्तें।

इस खंड में PRIOR column-name पिछले चरण द्वारा लौटाए गए परिणामसेट को संदर्भित करता है, और सरल column-name mytable . को संदर्भित करता है तालिका:

CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step2;

     LEVEL          X
---------- ----------
         2          2 
         2          3

चरण x+1

#2 दोहराएं जब तक कि अंतिम ऑपरेशन एक खाली परिणाम सेट न लौटा दे।

चरण 3

CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step3;

     LEVEL          X
---------- ----------
         3          3 
         3          4 
         3          4

चरण 4

CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step4;

     LEVEL          X
---------- ----------
         4          4 

चरण 5

CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or  "PRIOR".x + 2 = mytable.x;

select * from step5;

no rows selected

चरण 5 ने कोई पंक्ति नहीं लौटाई, इसलिए अब हम क्वेरी को अंतिम रूप देते हैं

अंतिम चरण

UNION ALL सभी चरणों के परिणाम और इसे अंतिम परिणाम के रूप में लौटाएं:

SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL

SELECT * FROM step5;

     LEVEL          X
---------- ----------
         1          1 
         2          2 
         2          3 
         3          3 
         3          4 
         3          4 
         4          4 

अब उपरोक्त प्रक्रिया को आपकी क्वेरी पर लागू करते हैं:

SELECT * FROM dual;

DUMMY
-----
X 

SELECT LEVEL FROM DUAL CONNECT BY rownum>5;

चरण 1

चूंकि क्वेरी में START WITH . शामिल नहीं है खंड, Oracle स्रोत तालिका से सभी रिकॉर्ड का चयन करता है:

CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;

select * from step1;

     LEVEL
----------
         1 

चरण 2

CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5

select * from step2;

no rows selected

चूंकि अंतिम चरण ने कोई पंक्ति नहीं लौटाई, इसलिए हम अपनी क्वेरी को अंतिम रूप देने जा रहे हैं।

अंतिम चरण

SELECT * FROM step1
UNION ALL

SELECT * FROM step2;

     LEVEL
----------
         1

पिछली क्वेरी का विश्लेषण:

select level from dual connect by rownum<10;

मैं आपको होमवर्क असाइनमेंट के रूप में छोड़ता हूं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 11g में प्रक्रिया में REFCURSOR चर को OUT पैरामीटर के रूप में प्रिंट करने में त्रुटि

  2. जावा में Oracle अंतराल का प्रतिनिधित्व कैसे करें

  3. TRUNC(दिनांक) Oracle में समारोह

  4. Oracle SQL डेवलपर में जॉब शेड्यूल कैसे करें?

  5. Oracle डेटाबेस में FORALL स्टेटमेंट का परिचय