Trong thành viên đệ quy, bạn hiện chỉ tham gia trên a.product_id = b.product_id
, thay vì a.order_id = b.order_id AND a.product_id = b.product_id
; Điều này không quan trọng trực tiếp ở đây nhưng sẽ xảy ra nếu các đơn đặt hàng khác nhau bao gồm các sản phẩm giống nhau, điều này có thể xảy ra trong thế giới thực.
Tuy nhiên, dữ liệu và truy vấn của bạn dường như không thực sự có chu kỳ. Có vẻ như bạn đang vấp phải lỗi với các tham gia ANSI; thêm một cycle
mệnh đề không tiết lộ bất kỳ hàng đi xe đạp nào, như mong đợi - và làm cho nó hoạt động !; và nó hoạt động với các phép nối kiểu cũ:
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;
Tuy nhiên, bạn không cần phải tham gia; bạn có thể làm:
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;
chỉ định 1 số lượng cố định trong lựa chọn cuối cùng, hoặc:
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;
chỉ định nó bên trong và cần theo dõi số lượng ban đầu dưới dạng bí danh mới.
Đối với cả hai thứ đó, tôi đã xóa + 1
từ việc so sánh số lượng, vì điều đó đã làm cho nó dừng lại quá sớm; với một order by
được thêm vào, cả hai đều nhận được:
ORDER_ID | PRODUCT_ID | SỐ LƯỢNG |
---|---|---|
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 |