web-dev-qa-db-ja.com

PostgreSQLに複数の結合があるUPDATEステートメント

incode_warrantsというテーブルを更新し、warn_docket_noviol_docket_noテーブルからincode_violationsに設定しようとしています。

Postgres 9.3には次のSQLクエリがありますが、起動すると次のエラーが発生します。

Error : ERROR:  relation "iw" does not exist
LINE 1: update iw

私はアクティブレコードの人なので、生のSQLスキルがひどく欠けています。このクエリを正しくする方法について誰かが私を正しい方向に向けるのを助けることができるかどうか私は思っていました。

update iw
set iw.warn_docket_no = iv.viol_docket_no
from incode_warrants as iw
INNER JOIN incode_warrantvs as iwvs
on iw.warn_rid = iwvs.warnv_rid
INNER JOIN incode_violations as iv
ON iv.viol_citation_no = iwvs.warnv_citation_no and iv.viol_viol_no = iwvs.warnv_viol_no
16
nulltek

Postgresの有効なUPDATEステートメントと同じ:

UPDATE incode_warrants iw
SET    warn_docket_no = iv.viol_docket_no
FROM   incode_warrantvs  iwvs
JOIN   incode_violations iv ON iv.viol_citation_no = iwvs.warnv_citation_no
                           AND iv.viol_viol_no = iwvs.warnv_viol_no
WHERE  iw.warn_rid = iwvs.warnv_rid;

FROM句のターゲットテーブルとして、UPDATE句のテーブルエイリアスを使用することはできません。更新される(1!)テーブルはUPDATEの直後にあります。必要に応じて、そこにエイリアスを追加できます。これがエラーメッセージの直接の原因ですが、それ以外にもあります。

更新される列は、常に更新される1つのテーブルからのものであり、テーブル修飾することはできません。

FROM句でターゲットテーブルを繰り返す必要はありません。

これらすべて、および優れたマニュアルの詳細

45

クエリは次のようになります。

UPDATE incode_warrants
SET warn_docket_no = incode_violations.viol_docket_no
FROM incode_violations
WHERE incode_violations.viol_citation_no = incode_warrants.warnv_citation_no
AND incode_violations.viol_viol_no = incode_warrants.warnv_viol_no;

他の参加は必要ありません。このクエリでは、あるテーブルの列を別のテーブルの列の値で更新するだけです。もちろん、WHERE条件がtrueの場合にのみ更新されます。

5

結合ではなくテーブルを更新する

update incode_warrants ALIAS
set warn_docket_no = iv.viol_docket_no
from incode_warrantvs as iw 
...
1