FROM
にリストされていないテーブルが参照されたときに暗黙的に句を追加していた古いバージョンのPostgreSQLの動作に依存していますFROM
。これはEXPLAIN
、クエリので確認できます。
この誤った機能はPostgreSQLから削除されました。それはタイプミスで偶発的な外積を引き起こし、一般的に非常に悪い考えでした。問題クエリの前のステートメントまたはでadd_missing_from
構成パラメーターをtrueに設定することにより、一時的な回避策として再度有効にすることができます。この下位互換性の回避策は9.0で削除されたため、9.0以降でアプリを動作させるために使用することはできません。パラメータが後のバージョンから削除されたため、意図的に8.4バージョンのドキュメントにリンクしました。SET
postgresql.conf
このメーリングリストのディスカッションを参照してください。
このクエリの問題の原因は、で暗黙的な結合を実行していることですMDFUSERGROUPREL
。ステートメントのUSING
句でこのテーブルに明示的に名前を付ける必要があります。DELETE
これが問題と回避策を示すデモです:http ://sqlfiddle.com/#!11 / 6c4b3 / 4 ...そしてこれが2つの異なる方法を正しく行う方法を示すデモです:http ://sqlfiddle.com/# !11 / 6c4b3/7。1つ目は、欠落しているfrom句をクエリに追加し、結果として生じる列名の競合を修正する単純な修正です。
DELETE FROM MDFUSERGROUPREL_DELETED
USING MDFUSERGROUPREL
WHERE MDFUSERGROUPREL_DELETED.userid = MDFUSERGROUPREL.userid
AND MDFUSERGROUPREL_DELETED.usergroupid = MDFUSERGROUPREL.usergroupid
AND MDFUSERGROUPREL_DELETED.userid=1;
EXISTS
後者の2つの例では、少なくとも最新バージョンのPostgreSQLでは同じクエリプランが生成されるため、使用するか結合するかに違いはありません。
テーブルエイリアスを使用しないというクエリの元のスタイルに従いましたが、読みやすくするためにエイリアスを使用することを強くお勧めします。@wildplasserの例を参照してください。