sql >> Database >  >> RDS >> Oracle

Cyclus gedetecteerd tijdens het uitvoeren van recursieve query

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;

db<>fiddle

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

db<>viool



  1. Bereken het totaal betaald uit een foreach gegenereerde tabel in codeigniter

  2. verander database (postgresql) in python met behulp van psycopg2 dynamisch

  3. PostgreSQL - GROUP BY timestamp-waarden?

  4. MySQL Connector/python werkt niet in django