I det rekursive medlem deltager du i øjeblikket kun på a.product_id = b.product_id
, i stedet for a.order_id = b.order_id AND a.product_id = b.product_id
; hvilket ikke direkte betyder noget her, men hvis forskellige ordrer inkluderede de samme produkter, hvilket sandsynligvis er i den virkelige verden.
Dine data og forespørgsler ser dog ikke ud til at have en cyklus. Du lader til at snuble over, hvad der ser ud til at være en fejl med ANSI joins; tilføjelse af en cycle
klausul afslører ikke nogen cykelrækker, som forventet - og får det til at fungere!; og det virker med old-style 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;
Du behøver dog slet ikke være med; du kan gøre:
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;
som tildeler den faste 1 mængde i det endelige valg, eller:
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;
som tildeler den indeni og skal spore den oprindelige mængde som et nyt alias.
For begge disse har jeg fjernet + 1
fra mængdesammenligningen, da det fik det til at stoppe for tidligt; med en order by
tilføjet, får de begge:
ORDER_ID | PRODUCT_ID | MÆNGDE |
---|---|---|
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 |