4

このような質問がたくさんあることは知っていますが、私の質問は、このエラーを取り除く方法ではなく、Oracleの9番目のバージョンでこれがどのように機能したかを知ることです。

RubyとOracleDBで記述された古いソースがありますが、最近バージョン=11にアップグレードされました。

Oracle DBのデータを編集できず、読み取るだけです。つまり、テーブルA(id、name、type、customer)とテーブルB(id、a_id、type、person)の2つのテーブルがあります。

それで。ソースコードにクエリがあります:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'

したがって、Oracle 9ではこれは完全に機能しましたが、「列があいまいに定義されています」というエラーが発生しました。

私が知りたいのは:

where type = 'A'

と同じです

where a.type = 'A' AND b.type = 'A'

また

where a.type = 'A' OR b.type = 'A'

4

4 に答える 4

5

これは ANSI スタイルの結合のバグだと思います。DBMS_XPLAN を使用して、古いデータベースでフィルタリングされていたテーブルを見つけます。

または、さらに良いことに、ビジネスロジックから、クエリが何をすべきかを解決します。

于 2011-08-31T09:50:08.630 に答える
5

いいえ、それが問題です。

where a.type = 'A'

またはそれは意味することができます

where b.type = 'A'

結果が異なる可能性があります。したがって、あいまいに定義されているというエラーが表示されます。

于 2011-08-31T08:39:04.390 に答える
2

Oracle 9(動作すると言う場所)でテストし、あいまいなクエリの出力を比較する必要があると思います:

--- Base
select a.id,b.id from a join b on a.id = b.a_id where type = 'A'

あいまいでないものの両方で:

--- QueryA
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A'

と:

--- QueryB
select a.id,b.id from a join b on a.id = b.a_id where b.type = 'A'

次のようなことができます:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A'
MINUS
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A'

(要するに):

(Base)
MINUS
(QueryA)

その後:

(QueryA)
MINUS
(Base)

上記のMINUSクエリが両方とも 0 行を返す場合、BASE クエリは QueryA として解釈されます。

同様に確認し、Base と QueryB を比較します。


このエラーのもう 1 つの考えられる理由は、移行中 (または移行とほぼ同じ時期)typeに、2 番目のテーブルに列が追加されたことです。それを確認するための古いバージョンのデータベース テーブルの定義はありますか?

于 2011-08-31T09:01:26.513 に答える
1

すべて-11gの最適化エンジンに大きな変更があったことを覚えておいてください。11gインスタンスでクエリオプティマイザレベルを10.2.xに設定すると、クエリが再び機能し始めると思います。

そうは言っても、データベースサーバーや背後にいるDBA /開発者にとって曖昧にならないように、エイリアスを指定する必要があります。:)

于 2011-09-01T02:09:44.587 に答える