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

Quy trình giải quyết không có tham số

Ngoài những nhận xét và câu trả lời bạn đã được đưa ra, tôi tin rằng bạn đã quá phức tạp hóa quy trình của mình. Bạn đang làm mọi thứ một cách rất thủ tục, thay vì suy nghĩ theo bộ như bạn nên làm. Bạn cũng đang nhận được các cột được tổng hợp trong ba truy vấn về cơ bản giống hệt nhau (ví dụ:cùng một bảng, điều kiện kết hợp và vị từ) - bạn có thể kết hợp tất cả chúng để nhận được ba kết quả trong một truy vấn duy nhất.

Có vẻ như bạn đang cố chèn vào bảng clienthistoricalpurchases nếu một hàng chưa tồn tại cho ứng dụng đó, nếu không, bạn cập nhật hàng. Điều đó ngay lập tức hét lên "tuyên bố MERGE" với tôi.

Kết hợp tất cả những điều đó, tôi nghĩ thủ tục hiện tại của bạn chỉ nên chứa một câu lệnh hợp nhất duy nhất:

MERGE INTO clienthistoricalpurchases tgt
  USING (SELECT clients.client_id,
                COUNT(DISTINCT od.productid) distinct_products,
                COUNT(od.productid) total_products,
                SUM((od.unitprice * od.quantity) - od.discount) proposed_new_balance
         FROM   orderdetails od
         INNER  JOIN orders
         ON     orderdetails.orderid = orders.orderid
         INNER  JOIN clients
         ON     orders.clientid = clients.clientid
         GROUP BY clients.client_id) src
  ON (tgt.clientid = src.client_id)
WHEN NOT MATCHED THEN
  INSERT (tgt.clientid,
          tgt.distinctproducts,
          tgt.totalproducts,
          tgt.totalcost) 
  VALUES (src.clientid,
          src.distinct_products,
          src.total_products,
          src.proposed_new_balance)
WHEN MATCHED THEN
  UPDATE SET tgt.distinctproducts = src.distinct_products,
             tgt.totalproducts = src.total_products,
             tgt.totalcost = src.proposed_new_balance;

Tuy nhiên, tôi có một số lo ngại về mô hình logic và / hoặc dữ liệu hiện tại của bạn.

Có vẻ như bạn đang mong đợi nhiều nhất một hàng cho mỗi khách hàng sẽ xuất hiện trong các giao dịch mua khách hàng. Điều gì sẽ xảy ra nếu một khách hàng có hai hoặc nhiều đơn đặt hàng khác nhau? Hiện tại, bạn sẽ ghi đè bất kỳ hàng hiện có nào.

Ngoài ra, bạn có thực sự muốn áp dụng logic này cho tất cả các đơn đặt hàng mỗi khi nó được chạy không?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt từ một bảng, được nhóm theo cột

  2. Nhóm các hàng dựa trên giá trị tổng của cột

  3. (Oracle SQL) Bắt một lỗi ràng buộc duy nhất

  4. Làm thế nào để định dạng một cột NUMBER trong Oracle?

  5. Ví dụ về hàm Oracle để lấy số ngày giữa hai ngày