Di anggota rekursif Anda saat ini hanya bergabung di a.product_id = b.product_id
, daripada a.order_id = b.order_id AND a.product_id = b.product_id
; yang tidak secara langsung penting di sini tetapi akan menjadi masalah jika pesanan yang berbeda menyertakan produk yang sama, yang kemungkinan besar terjadi di dunia nyata.
Data dan kueri Anda tampaknya tidak memiliki siklus. Anda tampaknya tersandung apa yang tampaknya menjadi bug dengan ANSI bergabung; menambahkan cycle
klausa tidak mengungkapkan baris bersepeda apa pun, seperti yang diharapkan - dan membuatnya berfungsi!; dan berfungsi dengan gabungan gaya lama:
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;
Anda tidak perlu bergabung sama sekali; Anda dapat melakukan:
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;
yang menetapkan 1 kuantitas tetap dalam pemilihan akhir, atau:
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;
yang menetapkannya di dalam dan perlu melacak jumlah asli sebagai alias baru.
Untuk keduanya saya telah menghapus + 1
dari perbandingan kuantitas, karena itu membuatnya berhenti terlalu dini; dengan order by
ditambahkan, keduanya mendapatkan:
ORDER_ID | PRODUCT_ID | KUANTITAS |
---|---|---|
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 |