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備忘録