PostgreSQLでJOINしたテーブルに対してUPDATE文を実行する際、真っ先に思い浮かぶのが以下のようなクエリ。
UPDATE tbl_A
SET status = 1
FROM tbl_A
LEFT JOIN tbl_B
ON tbl_A.id = tbl_B.id
WHERE
tbl_B.code = 'ABC'
;
SELECT文の場合は、上記のようにFROM句でテーブルを結合して処理をするのだが、UPDATE文の場合この方法ではうまくいかず、最悪の場合WHERE条件が効かずに全レコードにUPDATEがかかってしまう。
正解はこちら。
UPDATE tbl_A
SET status = 1
FROM tbl_B
WHERE
tbl_A.id = tbl_B.id
AND tbl_B.code = 'ABC'
;
JOINでテーブルを結合するのではなく、WHERE句の条件としてテーブル同士を結合しなくてはならない。
これなら狙いどおり、二つのテーブルを結合した後、codeの値がABCのレコードに対してのみUPDATE文の処理が実行される。