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

Wed, August 15, 2012 - 5 min read

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)

以上です。