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文の処理が実行される。