私はこのクエリをPostgres 9.1.3で使用しようとしています:
WITH stops AS (
SELECT citation_id,
rank() OVER (ORDER BY offense_timestamp,
defendant_dl,
offense_street_number,
offense_street_name) AS stop
FROM consistent.master
WHERE citing_jurisdiction=1
)
UPDATE consistent.master
SET arrest_id = stops.stop
WHERE citing_jurisdiction=1
AND stops.citation_id = consistent.master.citation_id;
私はこのエラーを受け取ります:
ERROR: missing FROM-clause entry for table "stops"
LINE 12: SET arrest_id = stops.stop
^
********** Error **********
ERROR: missing FROM-clause entry for table "stops"
SQL state: 42P01
Character: 280
私は本当に混乱しています。 WITH句はPostgresのドキュメントによれば正しいようです。 WITH句でクエリを個別に実行すると、正しい結果が得られます。
fine manual から:
データベース内の他のテーブルに含まれる情報を使用してテーブルを変更するには、副選択を使用する方法と、
FROM
句で追加のテーブルを指定する方法の2つがあります。
したがって、FROM句が必要です。
WITH stops AS (
-- ...
)
UPDATE consistent.master
SET arrest_id = stops.stop
FROM stops -- <----------------------------- You missed this
WHERE citing_jurisdiction=1
AND stops.citation_id = consistent.master.citation_id;
エラーメッセージはさらに多くを言います:
エラー:テーブル "stops"のFROM句エントリがありません
これは、テーブル名を誤って入力した場合にも発生する可能性があります。例えば:
UPDATE profiles SET name = ( profile.first_name ) WHERE id = 1
profiles
の代わりに、profile
を誤って使用しました!!これはうまくいくでしょう:
UPDATE profiles SET name = ( profiles.first_name ) WHERE id = 1