Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Lösungsverfahren ohne Parameter

Zusätzlich zu den Kommentaren und Antworten, die Sie bereits erhalten haben, glaube ich, dass Sie Ihr Verfahren massiv verkompliziert haben. Sie tun die Dinge sehr prozedural, anstatt in Sätzen zu denken, wie Sie es sein sollten. Sie erhalten auch die aggregierten Spalten in drei Abfragen, die im Wesentlichen identisch sind (z. B. dieselben Tabellen, Join-Bedingungen und Prädikate) – Sie könnten sie alle kombinieren, um die drei Ergebnisse in einer einzigen Abfrage zu erhalten.

Es sieht so aus, als ob Sie versuchen, etwas in die clienthistoricalpurchases-Tabelle einzufügen, wenn für diesen Kunden noch keine Zeile existiert, andernfalls aktualisieren Sie die Zeile. Das schreit mir sofort nach "MERGE-Statement".

Wenn Sie all das kombinieren, denke ich, dass Ihre aktuelle Prozedur nur eine einzige Merge-Anweisung enthalten sollte:

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;

Ich habe jedoch einige Bedenken bezüglich Ihrer aktuellen Logik und/oder Ihres Datenmodells.

Es scheint, als würden Sie erwarten, dass höchstens eine Zeile pro Client-ID in clienthistoricalpurchases erscheint. Was ist, wenn eine Client-ID zwei oder mehr verschiedene Bestellungen hat? Derzeit würden Sie jede vorhandene Zeile überschreiben.

Wollen Sie diese Logik wirklich jedes Mal, wenn sie ausgeführt wird, auf alle Bestellungen anwenden?