sql >> Database teknologi >  >> RDS >> Oracle

Cyklus registreret under udførelse af rekursiv forespørgsel

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;
 

db<>fiddle

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

db<>violin



  1. Når DRY-princippet ikke gælder:BITWISE-operationer i SQL Server

  2. Ændring af rækkefølge af poster fra frontend

  3. Få forskellige krypteringsresultater mellem C#.Net og Oracle

  4. FEJL 1045 (28000):Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:NEJ)