Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Đã phát hiện chu kỳ trong khi thực hiện truy vấn đệ quy

Trong thành viên đệ quy, bạn hiện chỉ tham gia trên a.product_id = b.product_id , thay vì a.order_id = b.order_id AND a.product_id = b.product_id; Điều này không quan trọng trực tiếp ở đây nhưng sẽ xảy ra nếu các đơn đặt hàng khác nhau bao gồm các sản phẩm giống nhau, điều này có thể xảy ra trong thế giới thực.

Tuy nhiên, dữ liệu và truy vấn của bạn dường như không thực sự có chu kỳ. Có vẻ như bạn đang vấp phải lỗi với các tham gia ANSI; thêm một cycle mệnh đề không tiết lộ bất kỳ hàng đi xe đạp nào, như mong đợi - và làm cho nó hoạt động !; và nó hoạt động với các phép nối kiểu cũ:

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

Tuy nhiên, bạn không cần phải tham gia; bạn có thể làm:

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;

chỉ định 1 số lượng cố định trong lựa chọn cuối cùng, hoặc:

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;

chỉ định nó bên trong và cần theo dõi số lượng ban đầu dưới dạng bí danh mới.

Đối với cả hai thứ đó, tôi đã xóa + 1 từ việc so sánh số lượng, vì điều đó đã làm cho nó dừng lại quá sớm; với một order by được thêm vào, cả hai đều nhận được:

ORDER_ID PRODUCT_ID SỐ LƯỢNG
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 <> fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01017 Mẹo giải quyết lỗi Oracle

  2. Làm cách nào để lấy n hàng đã mở khóa tiếp theo từ Oracle?

  3. Câu lệnh SQL chọn động với MyBatis

  4. Tìm nạp bản ghi vào ngày tối đa hàng tháng

  5. Giải thưởng bình chọn dành cho nhà phát triển cơ sở dữ liệu Oracle