0

サーバー側のループなどを実行しないと、1つのクエリに完全に適合できないモンスター更新クエリが少しあります。

他の2つのテーブルの値を使用して、マスターアカウントテーブルを更新したいと思います。マスターアカウントには、accountID、areaID、stockID、amountの4つの列があります。最初の3列が主キーです。

詳細を更新したい2つのテーブルはほぼ同じです。1つは着信注文で、もう1つは発信注文です。どちらにもorderID、stockID、amountの列が含まれています。主キーはorderIDとstockIDです。

別のテーブルオーダーがあり、マスターアカウントテーブルを更新するために参照する必要があるオーダーのareaIDとaccountIDがあります。これまでのところ、必要な詳細を取得するselect関数を取得できますが、それをupdateステートメントに転送する方法がわかりません。

SELECT a.*,o.orderID, SUM(io.amount) as in,SUM(oo.amount) as out
FROM account_stock AS a 
  INNER JOIN orders AS o ON o.accountID = a.accountID AND o.areaID = a.areaID 
  LEFT JOIN incoming_orders AS io ON io.stockID = a.stockID AND io.orderID = o.orderID 
  LEFT JOIN outgoing_orders AS oo ON oo.stockID = a.stockID AND oo.orderID = o.orderID
GROUP BY a.stockID,a.accountID,a.areaID

入荷と出庫の合計でaccount_stockファイルを更新する個別の更新クエリを実行できる場合、私は完全に失われます。

私のSQLはあまり一般的ではないことを理解しているので、テーブル構造の変更などの提案は歓迎されます。

4

1 に答える 1

1

select ステートメントで "in" と "out" と呼んだものを含む 2 つの列をマスター テーブルに作成する必要があります。ただし、「in」は予約語なので使用しないでください。この例では名前を変更していないので、わかりやすいと思います。ステートメントを書き直して、select ではなく update にしました。

update
    account_stock a,
    INNER JOIN orders AS o 
        ON o.accountID = a.accountID 
        AND o.areaID = a.areaID
    LEFT JOIN incoming_orders AS io 
        ON io.stockID = a.stockID 
        AND io.orderID = o.orderID
    LEFT JOIN outgoing_orders AS oo 
        ON oo.stockID = a.stockID 
        AND oo.orderID = o.orderID
set
    a.in=sum(io.amount),
    a.oo=sum(oo.amount)

コメントに記載されているように、これにより、MySQL は set fieldname=aggFunc() 領域内の集約関数を好まないため、ビスケットをひっくり返します。

次のコードはうまくいくはずです。

update
    account_stock f
set
    a.amount=(
    SELECT 
        SUM(io.amount)-SUM(oo.amount)
    FROM 
        account_stock AS a
        INNER JOIN orders AS o 
            ON o.accountID = a.accountID 
            AND o.areaID = a.areaID
        LEFT JOIN incoming_orders AS io 
            ON io.stockID = a.stockID 
            AND io.orderID = o.orderID
        LEFT JOIN outgoing_orders AS oo 
            ON oo.stockID = a.stockID 
            AND oo.orderID = o.orderID
    where
        f.stockid=a.stockid
        and f.accountid=a.accountid
        and f.areaid=a.areaid
    )
于 2012-06-19T04:19:00.987 に答える