下記のSQLなのですがなぜエラーになるのかわからずに困っています。ご教示いただけないでしょうか?UPDATE TRSET ZAIKO_TRN.ZAIKO_NUM = ZAIKO_TRN.ZAIKO_NUM + 7, ZAIKO_TRN.NYUKA_NUM = AIKO_TRN.NYUKA_NUM + 7, ENTRY_ID = 'U2290', SHOHIN_MST.UPDATE_DATETIME = NOW()FROM SHOHIN_MST AS TRLEFT JOIN ZAIKO_TRN ON SHOHIN_MST.SHOHIN_ID = ZAIKO_TRN.SHOHIN_ID WHERE SHOHIN_MST.SHOHIN_NAME LIKE '冬季%';

1件の回答

回答を書く

1020704

2026-02-22 01:25

+ フォロー

こんばんは



ご提示のSQLは「別名の不一致」「存在しないテーブル参照」「更新対象の誤り」が主因でエラーになります。下記の順で直すと解決できます。



主な原因と修正ポイント



1. 別名の不一致

- 問題:

- FROM句で SHOHIN_MST AS TR と別名を付けているのに、SETや

JOINで SHOHIN_MST.〜 と本名を使っています。

- 修正:

- 別名を付けたら以降は統一して TR.〜 を使います。



2. 存在しないテーブル(タイポ)

- 問題:

- ZAIKO_TRN.NYUKA_NUM = AIKO_TRN.NYUKA_NUM + 7AIKO_TRN が未定義。

- 修正:

- 目的が在庫テーブルの加算なら ZAIKO_TRN.NYUKA_NUM = ZAIKO_TRN.NYUKA_NUM + 7 に統一します。



3. 更新対象テーブルの誤り(多テーブル同時更新)

- 問題:

- UPDATE TR としながら、ZAIKO_TRNSHOHIN_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 '冬季%';





SQL Serverの場合の注意

- NOW()は存在しません。日時は
GETDATE() を使用してください。



sql

UPDATE SHOHIN_MST

SET UPDATE_DATETIME = GETDATE()

WHERE SHOHIN_NAME LIKE '冬季%';





まとめ

- 別名は統一して使用する。

- 未定義テーブル名(AIKO_TRN)は修正する。

- UPDATE対象は1テーブルに絞り、他テーブルの更新は別文に分ける。

- DBごとの日時関数に合わせる(PostgreSQL: NOW、SQL Server: GETDATE)。



お試しください

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有