sql >> データベース >  >> RDS >> Oracle

パラメータなしの解決手順

    あなたがすでに与えられたコメントと答えに加えて、私はあなたがあなたの手順を非常に複雑にしすぎたと信じています。あるべき姿でセットで考えるのではなく、非常に手続き的に物事を行っています。また、基本的に同一の3つのクエリ(同じテーブル、結合条件、述語など)で集計列を取得しています。これらすべてを組み合わせて、1つのクエリで3つの結果を取得できます。

    そのクライアントの行がまだ存在しない場合は、clienthistoricalpurchasesテーブルに挿入しようとしているようです。それ以外の場合は、行を更新します。それはすぐに私に「MERGEステートメント」を叫びます。

    これらすべてを組み合わせると、現在の手順には1つのマージステートメントのみを含める必要があると思います。

    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;
    

    ただし、現在のロジックやデータモデルについて懸念があります。

    clientidごとに最大で1行がclienthistoricalpurchasesに表示されることを期待しているようです。クライアントIDに2つ以上の異なる注文がある場合はどうなりますか?現在、既存の行を上書きします。

    また、実行されるたびにすべての注文にこのロジックを適用したいですか?



    1. 無効なパラメーター番号:パラメーターがバインドされていません

    2. java.sql.SQLException:ORA-01002:フェッチが順不同です

    3. Magentoテーブルsales_flat_orderフィールドprotect_codeの説明

    4. SSMA for Oracle ConnecttoOracleエラー