Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Siklus terdeteksi saat menjalankan kueri rekursif

Di anggota rekursif Anda saat ini hanya bergabung di a.product_id = b.product_id , daripada a.order_id = b.order_id AND a.product_id = b.product_id; yang tidak secara langsung penting di sini tetapi akan menjadi masalah jika pesanan yang berbeda menyertakan produk yang sama, yang kemungkinan besar terjadi di dunia nyata.

Data dan kueri Anda tampaknya tidak memiliki siklus. Anda tampaknya tersandung apa yang tampaknya menjadi bug dengan ANSI bergabung; menambahkan cycle klausa tidak mengungkapkan baris bersepeda apa pun, seperti yang diharapkan - dan membuatnya berfungsi!; dan berfungsi dengan gabungan gaya lama:

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

Anda tidak perlu bergabung sama sekali; Anda dapat melakukan:

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;

yang menetapkan 1 kuantitas tetap dalam pemilihan akhir, atau:

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;

yang menetapkannya di dalam dan perlu melacak jumlah asli sebagai alias baru.

Untuk keduanya saya telah menghapus + 1 dari perbandingan kuantitas, karena itu membuatnya berhenti terlalu dini; dengan order by ditambahkan, keduanya mendapatkan:

ORDER_ID PRODUCT_ID KUANTITAS
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<>biola



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengonfigurasi Replikasi Basis Data Heterogen – SQL Server ke Oracle

  2. Hasilkan DDL dengan Oracle Sql Developer untuk memasukkan kunci Asing

  3. Tabel database Oracle dalam tampilan grid

  4. Cara optimal untuk MENGHAPUS baris tertentu dari Oracle

  5. Pengembang SQL untuk mengimpor dari Excel