こんばんは
ご提示のSQLは「別名の不一致」「存在しないテーブル参照」「更新対象の誤り」が主因でエラーになります。下記の順で直すと解決できます。
主な原因と修正ポイント
1. 別名の不一致
- 問題:
- FROM句で SHOHIN_MST AS TR と別名を付けているのに、SETや
JOINで SHOHIN_MST.〜 と本名を使っています。
- 修正:
- 別名を付けたら以降は統一して TR.〜 を使います。
2. 存在しないテーブル(タイポ)
- 問題:
- ZAIKO_TRN.NYUKA_NUM = AIKO_TRN.NYUKA_NUM + 7 の AIKO_TRN が未定義。
- 修正:
- 目的が在庫テーブルの加算なら ZAIKO_TRN.NYUKA_NUM = ZAIKO_TRN.NYUKA_NUM + 7 に統一します。
3. 更新対象テーブルの誤り(多テーブル同時更新)
- 問題:
- UPDATE TR としながら、ZAIKO_TRN と SHOHIN_MST の列を同時にSETしています。
- 多くのDBでは、UPDATE直後に指定したテーブル(または別名)しか更新できません。
- 修正:
- 在庫を更新したいなら UPDATE ZAIKO_TRN を対象にし、SHOHIN_MST はJOINのみで条件に使う。
- 商品側の UPDATE_DATETIME を更新したい場合は「別のUPDATE文」に分けます。
PostgreSQLの修正版(在庫のみ更新)sql
UPDATE ZAIKO_TRN z
SET
ZAIKO_NUM = z.ZAIKO_NUM + 7,
NYUKA_NUM = z.NYUKA_NUM + 7,
ENTRY_ID = 'U2290'
FROM SHOHIN_MST s
WHERE s.SHOHIN_ID = z.SHOHIN_ID
AND s.SHOHIN_NAME LIKE '冬季%';
商品テーブルの更新は別文で:sql
UPDATE SHOHIN_MST s
SET UPDATE_DATETIME = NOW()
WHERE s.SHOHIN_NAME LIKE '冬季%';GETDATE()
SQL Serverの場合の注意
- NOW()は存在しません。日時は を使用してください。sql
UPDATE SHOHIN_MST
SET UPDATE_DATETIME = GETDATE()
WHERE SHOHIN_NAME LIKE '冬季%';
まとめ
- 別名は統一して使用する。
- 未定義テーブル名(AIKO_TRN)は修正する。
- UPDATE対象は1テーブルに絞り、他テーブルの更新は別文に分ける。
- DBごとの日時関数に合わせる(PostgreSQL: NOW、SQL Server: GETDATE)。
お試しください