PostgreSQL にて ERROR: missing FROM-clause entry for table というエラーが発生した場合の対応方法をご紹介します。
ERROR: missing FROM-clause entry for table
バージョン 8.1 以降の 8 系は、SET add_missing_from TO true; で対応できるみたいです。
バージョン8.1への移行add_missing_fromのデフォルトがfalseになりました(Neil)
FROM参照を持たない問い合わせでテーブルが使用された場合、デフォルトでエラーとなるようになりました。 まだ過去の動作を使用することができますが、そのためにはこのパラメータを’true’にしなければなりません。
ダンプに暗黙的なFROM構文を使用して作成したビューやルールがある場合、既存のダンプファイルをロードするために、add_missing_fromを真に設定しなければならないかもしれません。 これに悩まされるのは一回だけのはずです。 PostgreSQL 8.1は、こうしたビューやルールを標準の明示的なFROM構文に変換するためです。 したがって、今後のダンプではこの問題は起こりません。
ss=> SELECT work.* FROM work w; -- 一見正しそうなこのSQLもエラーになる ERROR: missing FROM-clause entry for table "work" oss=> SET add_missing_from TO true; -- デフォルト値がfalse SET oss=> CREATE VIEW work_v AS SELECT w.* FROM work w ; CREATE VIEW oss=> \\d work_v VIEWとして読み込ませると定義は自動的に訂正される View "public.work_v" Column | Type | Modifiers --------+--------+----------- id | bigint | value | text | stat | text | View definition: SELECT w.id, w.value, w.stat FROM "work" w;
add_missing_from(boolean) オンの場合、問い合わせによって参照されるテーブルは、既に存在していなければFROM句に追加されます。この振る舞いはSQL標準に準拠しておらず、多くのユーザは(そのエイリアスを参照しなければならないテーブル参照をする場合など)誤りを隠蔽するため、嫌がります。デフォルトはoffです。この変数は、この振る舞いがデフォルトで認められている8.1以前のPostgreSQLリリースとの互換性を有効にします。この変数が有効になっているとしても、問い合わせによって参照される個々の明示的FROMエントリに対し、警告メッセージが放出されることに注意してください。問い合わせのFROM句に対する問い合わせで参照される全てのテーブルを追加すること(もしくはDELETEの場合のそのUSING句)に依る、この振る舞いに信頼を置かないアプリケーションの更新に、ユーザは消極的になります。
- 引用元: バージョンとプラットフォーム互換性
バージョン 9.0 からは add_missing_from が廃止されたみたいなので、SQLクエリを書き換えるしかないようでした。
バージョン 9.0 への移行 / 互換性のない変更点 サーバ設定の非互換設定 add_missing_from が廃止されました。 これはかなり以前からデフォルトで off となっていました。 (Tom Lane)
以上です。