पुनरावर्ती सदस्य में आप वर्तमान में केवल 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;
हालांकि आपको इसमें शामिल होने की बिल्कुल भी आवश्यकता नहीं है; आप यह कर सकते हैं:
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 |