ORA-00918 が発生することを期待する Oracle の奇妙な動作に遭遇しましたが、そうではありません。たとえば、このクエリを考えてみましょう。
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
このクエリは、トリガーが無効になっているテーブルの詳細を概念的に探していますが、これは私が解決しようとしている問題ではないことに注意してください。この問題は、このクエリ、データ ディクショナリ、ビュー、またはテーブルに固有のものではありません。私が知る限り、テーブルまたはビューの任意のセットに適用されます (私が試した 2 つまたは 3 つから)。
とにかく、このクエリを実行しようとすると、ORA-00918 が返されます。これは、句を実行するためのクエリを取得するために、と の両方USER_TABLES
にsoUSER_TRIGGERS
という列があるため、に変更する必要があるためです。わかりました。代わりに、別のテーブルに参加してみてください。STATUS
WHERE
TRG.STATUS
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
このクエリは、どの STATUS 列を意味するかを修飾することなく、魔法のように機能します! セマンティクスやクエリが返すものは気にしないでください。エラーはありません。 USER_CONSTRAINTS
tooと呼ばれる列もありSTATUS
ますが、選択する列が 2 つある場合に何をすべきかわからないのはなぜですか。
ちなみに、これはすべて10.2.0.3.0であり、クエリに2つ以上のテーブルがある場合、本質的にORA-00918の発生が停止します。これが Oracle のバグである場合、それがいつ修正されたのか、データベースがアップグレードされた場合にカウボーイ クエリが失敗する可能性が高い Oracle のバージョンを知っている人はいますか?
アップデート
バグが 11.2.0.1.0 で修正されたことを実証してくれた BQ に感謝します。以前のバージョンで修正されたことを示すことができる人には報奨金があります!