[PostgreSQL] ERROR: missing FROM-clause entry for table

PostgreSQL にて ERROR: missing FROM-clause entry for table というエラーが発生した場合の対応方法をご紹介します。

PostgreSQL

エラーメッセージ 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)

以上です。