PostgreSQLで別テーブルの値を参照しながらUPDATEしたい場合、SQL Serverなどで使われるUPDATE JOINの書き方とは少し異なります。そのため、他のデータベースで利用できる構文をそのまま使用するとエラーになることがあります。
PostgreSQLでは、テーブル結合を利用した更新処理にはUPDATE文のFROM句を利用します。この記事では、別テーブルの値で更新する方法や、エラーになりやすい記述例、正しいSQLの書き方について具体例を交えて解説します。
PostgreSQLで別テーブルを参照してUPDATEする基本構文
PostgreSQLでは、UPDATE文にFROM句を追加することで、別テーブルを参照しながら更新できます。
基本的な構文は以下のようになります。
UPDATE 更新対象テーブル
SET 更新対象カラム = 参照テーブル.カラム
FROM 参照テーブル
WHERE 更新対象テーブル.結合カラム = 参照テーブル.結合カラム;
FROM句で更新に利用するテーブルを指定し、WHERE句でどの行同士を結合するかを指定します。
UPDATE FROMを使った具体的な更新例
例えば、テーブルAの項目Aを、テーブルBの項目Bの値で更新したい場合を考えます。
条件は、テーブルAの項目CとテーブルBの項目Dが一致する場合とします。
正しいSQLは以下のようになります。
UPDATE A.テーブルA
SET 項目A = B.項目B
FROM A.テーブルB AS B
WHERE A.テーブルA.項目C = B.項目D;
ポイントは、SET句では更新対象テーブルではなく、FROM句で指定した参照テーブルのカラムを直接指定することです。
エラーになるUPDATE文の原因
質問のSQLでは、以下のような記述があります。
UPDATE A.テーブルA SET 項目A=A.テーブルB.項目B FROM A.テーブルB WHERE A.テーブルA.項目C=A.テーブルB.項目D
この書き方がエラーになる主な原因は、テーブル名の指定方法とエイリアスの扱いです。
PostgreSQLでは、FROM句に記述したテーブルを参照する場合、テーブル名を直接何度も書くよりも、エイリアスを設定して利用するのが一般的です。
また、SQL ServerのようなUPDATE文でINNER JOINを直接書く形式はPostgreSQLでは利用できません。そのため、PostgreSQLではUPDATE FROM形式に置き換える必要があります。
SQL ServerのUPDATE JOINとの違い
SQL Serverでは、以下のようなJOINを使った更新構文がよく利用されます。
UPDATE A
SET A.項目A = B.項目B
FROM テーブルA A
INNER JOIN テーブルB B
ON A.項目C = B.項目D;
一方、PostgreSQLでは同じ考え方をFROM句で表現します。
UPDATE テーブルA AS A
SET 項目A = B.項目B
FROM テーブルB AS B
WHERE A.項目C = B.項目D;
処理の流れは同じですが、SQL方言によって記述方法が異なる点に注意が必要です。
UPDATE FROMを使う時の注意点
UPDATE FROMを利用する場合、結合条件によっては1つの更新対象行に対して複数の参照行が一致する可能性があります。
例えば、テーブルAの1行に対してテーブルBに一致するデータが複数存在すると、PostgreSQLではどの値が採用されるか保証されません。
そのため、更新前にSELECT文で結合結果を確認することが重要です。
SELECT A.項目A, B.項目B
FROM A.テーブルA AS A
JOIN A.テーブルB AS B
ON A.項目C = B.項目D;
この結果を確認して、1対1で対応していることを確認してからUPDATEを実行すると安全です。
トラブルを防ぐための実践的な手順
複数テーブルを利用したUPDATEを行う場合、いきなりUPDATE文を書くのではなく、まず同じ条件でSELECT文を作成する方法がおすすめです。
例えば、以下のような確認を行います。
SELECT 更新対象テーブルのID, 参照テーブルの更新後値
FROM 更新対象テーブル
JOIN 参照テーブル
ON 結合条件;
SELECT結果が期待通りであれば、そのSELECTをUPDATE FROM形式に変更します。
この手順を習慣にすると、誤った条件で大量のデータを更新してしまう事故を防ぐことができます。
まとめ
PostgreSQLで別テーブルの値を利用してUPDATEする場合は、SQL ServerのようなUPDATE JOINではなく、UPDATE文のFROM句を利用します。
基本形は「UPDATEで更新対象を指定し、FROMで参照テーブルを指定し、WHEREで結合条件を書く」という形です。
また、UPDATE前にSELECTで結合結果を確認することで、安全かつ正確なデータ更新ができます。PostgreSQL独自のUPDATE FROM構文を理解しておくと、複数テーブルを扱う更新処理を効率的に記述できるようになります。


コメント