SQL備忘録~サブクエリでアップデートしたい

update文がうまくいかず10時間悩んでます。

 

備忘録として書いておこうと思います。

 

・基本マスタに集計する日付を記録

・1か月の仕入れ数と売上数を計算して在庫をだす。

・サブクエリで在庫集計はできてる。

・集計した在庫数を商品マスタの在庫にupdateで上書きしたい

 

参考コードーーーーーーーーーーー

UPDATE
    tableA t1,
    ( SELECT  t3.ID,  t3.column01
        FROM  tableB t3
        WHERE   t3.ID < 100  ) t2
SET
    t1.column01 = t2.column01
WHERE
    t1.ID = t2.ID

ーーーーーーーーーーーーーーーーー

SELECTした結果をもとにUODATEをできることは確認済み

しかし、そのSELECTが結合していたりと複雑

 

 

未解決コードーーーーーーーーーーーーー

 

UPDATE
商品マスタ AS A ,

(SELECT B.shohin_code AS shohin_code ,

  B.zaiko + SUM(C.suryo) - SUM(D.suryo) as Newzaiko

FROM 商品マスタ AS B
LEFT JOIN ( SELECT shohin_code, suryo
                      FROM  仕入れメイン AS E
                     INNER JOIN 仕入れ明細 AS F  ON E.id = F.id

                    WHERE nyuuko_ymd >= (

      SELECT DATE_FORMAT(基本マスタ.zaiko_ymd , '%Y-%m-01' )

      FROM 基本マスタ )

      AND nyuuko_ymd <= (

      SELECT LAST_DAY(基本マスタ.zaiko_ymd )

      FROM 基本マスタ) )  AS C ON B.shohin_code = C.shohin_code

LEFT JOIN ( SELECT shohin_code, suryo
      FROM 売上メイン AS G
      INNER JOIN 売上明細 AS H

                     ON G.id = H.id
                     WHERE uriage_ymd >= (

                     SELECT DATE_FORMAT(基本マスタ.zaiko_ymd , '%Y-%m-01' )

      FROM 基本マスタ )

                     AND uriage_ymd <= (

                     SELECT LAST_DAY(基本マスタ.zaiko_ymd )

      FROM 基本マスタ) ) AS D ON B.shohin_code = D.shohin_code

 GROUP BY B.shohin_code ) AS I
SET
A.zaiko = I.zaiko
WHERE
A.shohin_code = I.shohin_code

 

ーーーーーーーーーーーーーーーーーーーーーーーーー

 

解決策模索中ーーーーーー

 

 結論。できませんでした。

プログラムでDataTableにいったんいれて

別SQL文でDataTableを1つずつアップデートかけることで

やり過ごすことにします。

時間がかかるのがネックですが

月に1度の処理なのでまぁ大丈夫だろう。

 

追記ーーーーーーーーーーーー

案の定怒られました。

あまりに無駄が多すぎると。

SQL分だけで更新する方法がわからず、

UPDATE tm_hanbaishohin t1, (SELECT FROM )t2
SET t1.kurikoshizaiko = t2.zaiko
WHERE t1.shohin_code = t2.shohin_code 

これにあてはめろって・・・

できましたが、なんでできたからまだわからず。。

 

解決SQLーーーーーーーーーーーーー

UPDATE 商品マスタ A,
(SELECT B.shohin_code, B.kurikoshizaiko + SUM(C.suryo) - SUM(D.suryo) as Newzaiko
FROM 商品マスタ AS B
LEFT JOIN ( SELECT shohin_code, suryo
FROM 仕入メイン E
INNER JOIN 仕入明細 s on E.id = s.id
WHERE nyuuko_ymd >= (SELECT DATE_FORMAT(基本マスタ.zaiko_ymd, '%Y-%m-01' ) FROM 基本マスタ )
AND nyuuko_ymd <= (SELECT LAST_DAY(基本マスタ.zaiko_ymd ) FROM 基本マスタ ) ) C ON B.shohin_code = C.shohin_code
LEFT JOIN ( SELECT shohin_code, suryo
FROM 売上メイン G
INNER JOIN 売上明細 H ON G.id = H.id
WHERE uriage_ymd >= (SELECT DATE_FORMAT(基本マスタ.zaiko_ymd, '%Y-%m-01' ) FROM 基本マスタ )
and uriage_ymd <= (SELECT LAST_DAY(基本マスタ.zaiko_ymd ) FROM 基本マスタ ) ) D ON B.shohin_code = D.shohin_code
GROUP BY B.shohin_code) I
SET A.zaiko = I.Newzaiko
WHERE A.shohin_code = I.shohin_code;

 

 

 

以上。SQL備忘録