In het recursieve lid waar je momenteel alleen lid van wordt op a.product_id = b.product_id
, in plaats van a.order_id = b.order_id AND a.product_id = b.product_id
; wat hier niet direct van belang zou zijn, maar dat zou wel het geval zijn als verschillende bestellingen dezelfde producten bevatten, wat waarschijnlijk in de echte wereld is.
Uw gegevens en zoekopdracht lijken echter geen cyclus te hebben. Je lijkt te struikelen over wat een bug lijkt te zijn met ANSI-joins; een cycle
toevoegen clausule onthult geen fietsrijen, zoals verwacht - en laat het werken!; en het werkt met oude stijl joins:
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;
Je hoeft echter helemaal niet mee te doen; je kunt doen:
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;
die de vaste 1 hoeveelheid toewijst in de uiteindelijke selectie, of:
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;
die het binnen toewijst en de oorspronkelijke hoeveelheid moet volgen als een nieuwe alias.
Voor beide heb ik de + 1
. verwijderd uit de hoeveelheidsvergelijking, want daardoor stopte het te vroeg; met een order by
toegevoegd, krijgen ze allebei:
ORDER_ID | PRODUCT_ID | HOEVEELHEID |
---|---|---|
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 |