sql >> Base de Datos >  >> RDS >> Oracle

Procedimiento de resolución sin parámetros

Además de los comentarios y las respuestas que ya le han dado, creo que ha complicado enormemente su procedimiento. Estás haciendo las cosas de manera muy procedimental, en lugar de pensar en conjuntos como debería ser. También obtiene las columnas agregadas en tres consultas que son esencialmente idénticas (por ejemplo, las mismas tablas, condiciones de combinación y predicados); puede combinarlas todas para obtener los tres resultados en una sola consulta.

Parece que está tratando de insertar en la tabla de compras históricas del cliente si aún no existe una fila para ese cliente; de ​​lo contrario, actualice la fila. Eso inmediatamente me grita "declaración MERGE".

Combinando todo eso, creo que su procedimiento actual debería contener solo una sola declaración de combinación:

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;

Sin embargo, tengo algunas preocupaciones sobre su lógica actual y/o modelo de datos.

Parece que espera que aparezca como máximo una fila por ID de cliente en compras históricas de clientes. ¿Qué sucede si un ID de cliente tiene dos o más pedidos diferentes? Actualmente, sobrescribiría cualquier fila existente.

Además, ¿realmente desea aplicar esta lógica en todos los pedidos cada vez que se ejecuta?