sql >> Databasteknik >  >> RDS >> Oracle

Cykel upptäckt under exekvering av rekursiv fråga

I den rekursiva medlemmen går du för närvarande endast med på a.product_id = b.product_id , istället för a.order_id = b.order_id AND a.product_id = b.product_id; vilket inte direkt spelar någon roll här men skulle göra det om olika beställningar inkluderade samma produkter, vilket troligen är i den verkliga världen.

Dina data och din fråga verkar dock inte ha någon cykel. Du verkar snubbla över vad som verkar vara ett fel med ANSI-anslutningar; lägga till en cycle klausul avslöjar inte några cykelrader, som förväntat - och får det att fungera!; och det fungerar med gammaldags kopplingar:

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<>fiol

Du behöver dock inte gå med alls; du kan göra:

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 tilldelar den fasta 1-kvantiteten i det slutliga valet, 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 tilldelar den inuti och behöver spåra den ursprungliga kvantiteten som ett nytt alias.

För båda dessa har jag tagit bort + 1 från kvantitetsjämförelsen, eftersom det gjorde att det slutade för tidigt; med en order by läggas till får de båda:

ORDER_ID PRODUCT_ID ANTAL
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<>fiol



  1. SQL-satser Fel i Java-kod med Intellij och DB Navigator

  2. MySQL INSERT utan att behöva ange alla icke-standardfält (#1067 - Ogiltigt standardvärde för 'tabell')

  3. Kan inte anropa PostgreSQL:s 11 lagrade procedur med Hibernate

  4. Hur sänker man kafka-ämnet till oracle med kafka connect?