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

पुनरावर्ती क्वेरी निष्पादित करते समय चक्र का पता चला

पुनरावर्ती सदस्य में आप वर्तमान में केवल a.product_id = b.product_id . पर शामिल हो रहे हैं , के बजाय a.order_id = b.order_id AND a.product_id = b.product_id; जो सीधे तौर पर यहां मायने नहीं रखता है, लेकिन अगर अलग-अलग ऑर्डर में वही उत्पाद शामिल होते हैं, जो वास्तविक दुनिया में होने की संभावना है।

हालांकि आपके डेटा और क्वेरी में वास्तव में चक्र नहीं लगता है। ऐसा लगता है कि आप एएनएसआई जॉइन के साथ एक बग प्रतीत हो रहे हैं; एक cycle जोड़ना खंड किसी भी साइकिल चालन पंक्तियों को प्रकट नहीं करता है, जैसा कि अपेक्षित है - और यह काम करता है!; और यह पुरानी शैली के जॉइन के साथ काम करता है:

WITH
    cte (order_id,
         product_id,
         quantity,
         cnt)
    AS
        (SELECT order_id,
                product_id,
                1 as quantity,
                1 as cnt
           FROM order_tbl2        
         UNION ALL
         SELECT a.order_id,
                a.product_id,
                b.quantity,
                b.cnt + 1
           FROM order_tbl2 A, cte b
          WHERE b.cnt + 1 < a.quantity
            AND a.order_id = b.order_id
            AND a.product_id = b.product_id
            )
SELECT order_id, product_id, quantity
  FROM cte;

db<>fiddle

हालांकि आपको इसमें शामिल होने की बिल्कुल भी आवश्यकता नहीं है; आप यह कर सकते हैं:

WITH
    cte (order_id,
         product_id,
         quantity,
         cnt)
    AS
        (SELECT order_id,
                product_id,
                quantity,
                1 as cnt
           FROM order_tbl2        
         UNION ALL
         SELECT b.order_id,
                b.product_id,
                b.quantity,
                b.cnt + 1
           FROM cte b
          WHERE  b.cnt < b.quantity)
SELECT order_id, product_id, 1 as quantity
  FROM cte;

जो अंतिम चयन में निश्चित 1 मात्रा निर्दिष्ट करता है, या:

WITH
    cte (order_id,
         product_id,
         real_quantity,
         quantity,
         cnt)
    AS
        (SELECT order_id,
                product_id,
                quantity as real_quantity,
                1 as quantity,
                1 as cnt
           FROM order_tbl2        
         UNION ALL
         SELECT b.order_id,
                b.product_id,
                b.real_quantity,
                b.quantity,
                b.cnt + 1
           FROM cte b
          WHERE  b.cnt < b.real_quantity)
SELECT order_id, product_id, quantity
  FROM cte;

जो इसे अंदर निर्दिष्ट करता है और मूल मात्रा को एक नए उपनाम के रूप में ट्रैक करने की आवश्यकता होती है।

उन दोनों के लिए मैंने + 1 . को हटा दिया है मात्रा की तुलना से, क्योंकि वह इसे बहुत जल्दी रोक रहा था; order by . के साथ जोड़ा, वे दोनों प्राप्त करते हैं:

<वें शैली="पाठ्य-संरेखण:दाएं;">मात्रा
ORDER_ID PRODUCT_ID
ORD1 PROD1 1
ORD1 PROD1 1
ORD1 PROD1 1
ORD1 PROD1 1
ORD1 PROD1 1
ORD2 PROD2 1
ORD2 PROD2 1
ORD3 PROD3 1
ORD3 PROD3 1
ORD3 PROD3 1

db<>fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल 1 से 100 तक की संख्याओं की सूची बनाने के लिए

  2. Oracle कंडीशन चेकिंग

  3. ORACLE में विभाजन तालिका का नाम स्वतः बदल जाता है

  4. प्रत्येक खाते के लिए नवीनतम अनुबंध ढूँढना

  5. एसक्यूएल कमांड में तारीख की तुलना करें