2010-11-24 1 views
16

私は、ORA-00918が呼び出されると期待しているが、オラクルでは奇妙な動作に遭遇しましたが、そうではありません。たとえば、このクエリを実行します。Oracleは、この問合せに対して「ORA-00918:列があいまいに定義されました」をなぜ呼び出さないのですか?

SELECT * 
FROM USER_TABLES TAB 
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME 
WHERE STATUS = 'DISABLED' 

このクエリは、概念的無効のトリガーを持つテーブルの詳細を探しているが、これは私が解決しようとしている問題ではないことに注意してくださいされています。この問題は、この問合せ、データ・ディクショナリ、ビューまたは表に固有の問題ではありません。限り、私はそれがテーブルやビュー(私が試した2つまたは3つから)の任意のセットに適用されると言うことができる限り。

とにかく、このクエリを実行しようとUSER_TABLESUSER_TRIGGERS両方がそうWHERE句を実行するためのクエリがTRG.STATUSに変更する必要が取得するためにSTATUSという列を持っているので、あなたは、ORA-00918を取得します。 [OK]をクール、代わりに別のテーブルに参加しようとします。

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にはSTATUSという列もありますので、2つの列を選択するときにどうしたらよいかわからないのですが、それはもっと曖昧です。

ところで、これはすべて10.2.0.3.0です。つまり、ORA-00918は、クエリに2つ以上のテーブルがある場合に発生しなくなります。これがOracleバグの場合は、誰が修正されたかを知っていますか?データベースがアップグレードされているとカウボーイのクエリが爆発する可能性が高いOracleバージョンはありますか?バグを実証するためのBQへ

更新

おかげで11.2.0.1.0に固定されています。それ以前のバージョンで修正されたことを示すことができる人のための賞金!

+1

確かに、2番目のクエリで 'distinct status'を選択し、' select distinct tab.status'で別の結果を得ることができます。 – Benoit

+0

私は同じ動作9.2.0.8.0と10.2.0.4.0を参照してください –

+0

私は以前この問題で悩まされてきました。他のテーブルへの外部結合後にキー列にNULLが含まれていた理由を操作できませんでした。私は唯一ではないことを見て良かった!そしてそれが11gで修正されているのを見てうれしい。 –

答えて

8

は言うことはできませんが、ここに私の結果です:

Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, 
Data Mining and Real Application Testing options 

SQL> SELECT * 
    2 FROM USER_TABLES TAB 
    3 JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME 
    4 WHERE STATUS = 'DISABLED'; 
WHERE STATUS = 'DISABLED' 
     * 
ERROR at line 4: 
ORA-00918: column ambiguously defined 

SQL> ed 
Wrote file afiedt.buf 

    1 SELECT * 
    2 FROM USER_TABLES TAB 
    3 JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME 
    4 JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME 
    5* WHERE STATUS = 'DISABLED' 
SQL>/
WHERE STATUS = 'DISABLED' 
     * 
ERROR at line 5: 
ORA-00918: column ambiguously defined 
+0

@BQ質問を間違えたかもしれないと思います。それはエラーを発生させますが、USER_CONSTRAINTSを追加すると –

+0

@Conradにはなりませんでした。私はそれを逃しましたが、私は自分の答えを編集して、両方のクエリでORA-00918を実際に取得していることを示しました。 –

+0

@BQ +1それは知っていいそれは固定された –

2

ANSI SQLを使用しています。私は、where節のSTATUSと駆動テーブルを関連付けると推測しています。

「oracle」構文を使用すると、予想される動作が表示されます。それが修正されたとき

SELECT * 
FROM USER_TABLES TAB, USER_TRIGGERS TRG, USER_CONSTRAINTS CON 
WHERE TRG.TABLE_NAME = TAB.TABLE_NAME 
AND CON.TABLE_NAME = TAB.TABLE_NAME 
AND STATUS = 'DISABLED' 
+3

ANSIとOracleの構文ではなく、両方ともANSIであるため、ANSI 89とANSI 92として参照することをお勧めします。 –

+0

@Conrad - yup。あなたは正しいです。 – erbsock

13

は、Oracleのサポートを検索し、この発見:

バグ5368296を - ANSI SQLがORA-報告しないことがあり参加します

:あいまいなカラム[ID 5368296.8】影響されると確認

バージョンの918この問題は、Windowsプラットフォーム

  • 10.2.0.5(サーバパッチ・セット)
  • にパッチ2

    • 10.2.0.4に固定されている
    • 10.2.0.3
    • 10.2.0.4

  • 11.1.0。6(Base Release)
  • 詳細を表示するにはOracleサポートアカウントが必要ですが、影響を受けるOracle Bug番号/バージョンは正しい方向にあなたを指し示すためには問題ありません。 Oracleサポート。ここでは、この程度

    +0

    良い1つのBQ、それはちょうど私が後だったものです。どうもありがとう! – batwad

    0

    で固定であるということです、私は11.2.0.2.0でこれをしようとすると、私は同じ問題を取得します。機能に関係なく、左右の結合を追加すると、このバグはまったく修正されていないようです!

    SELECT * 
    FROM USER_TABLES TAB 
    LEFT JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME 
    RIGHT JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME 
    WHERE STATUS = 'DISABLED' 
    
    関連する問題