sql >> Databáze >  >> RDS >> Oracle

Postup řešení bez parametrů

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í?



  1. vyberte sloupec jako true / false, pokud id existuje v jiné tabulce

  2. Jak přeložit funkci PostgreSQL merge_db (aka upsert) do MySQL

  3. Získejte hraniční hodnoty pro dělenou tabulku v SQL Server (T-SQL)

  4. je dočasná tabulka mysql jedinečná pro každého uživatele, který přistupuje ke skriptu, který ji vytváří...?