Kromě připomínek a odpovědí, které jste již dostali, se domnívám, že jste svůj postup masivně zkomplikovali. Děláte věci velmi procedurálně, spíše než přemýšlíte v sadách, jak byste měli být. Získáváte také agregované sloupce ve třech dotazech, které jsou v podstatě identické (např. stejné tabulky, podmínky spojení a predikáty) – můžete je všechny zkombinovat a získat tři výsledky v jediném dotazu.
Vypadá to, že se pokoušíte vložit do tabulky clienthistoricalpurchases, pokud řádek pro daného klienta již neexistuje, jinak řádek aktualizujete. To na mě okamžitě křičí „Prohlášení MERGE“.
Když to zkombinujeme, myslím, že váš současný postup by měl obsahovat pouze jeden příkaz sloučení:
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;
Mám však určité obavy ohledně vaší současné logiky a/nebo datového modelu.
Zdá se, že očekáváte, že se v historii nákupů klientů zobrazí maximálně jeden řádek na ID klienta. Co když má clientid dvě nebo více různých objednávek? V současné době byste přepsali jakýkoli existující řádek.
Také opravdu chcete použít tuto logiku na všechny objednávky pokaždé, když se spustí?