incode_warrants
というテーブルを更新し、warn_docket_no
をviol_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
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
句でターゲットテーブルを繰り返す必要はありません。
クエリは次のようになります。
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の場合にのみ更新されます。
結合ではなくテーブルを更新する
update incode_warrants ALIAS
set warn_docket_no = iv.viol_docket_no
from incode_warrantvs as iw
...