0

複雑なデータベースでクエリを実行しています:

SELECT *
FROM
table1,
table2,
table3,
table4,
table5,
table6,
table7,
table8
WHERE
a = b and
c = d and
e = d and
(
(strfldvar = 'BROKEN_ARROW' AND x = g) 
OR (strfldvar = 'BROKEN_BOX' AND y = g)
)    and
f = h and
i = j

strfldvar = 'BROKEN_BOX' の場合のみ機能し、strfldvar = 'BROKEN_ARROW' の場合は機能しません。交換したら

(
(strfldvar = 'BROKEN_ARROW' AND x = g) 
OR (strfldvar = 'BROKEN_BOX' AND y = g)
)    and

x = gまたはy = gのいずれかを使用すると、そのように 2 つの別々のクエリを実行しても問題なく動作します。strfldvar = 'BROKEN_ARROW' の場合のエラー メッセージは次のとおりです。

ORA-01013: ユーザーが現在の操作の取消をリクエストしました

このエラー メッセージが表示される前に、コンピューターはおそらく 2 分間深く考えます。

ここで何が間違っていますか?

参考までに、2 つの別々の実行のフィールドの名前を調べたところ、同じように見えます。つまり、出力のスキーマは両方で同じに見えます。しかし、それが重要な場合、それらが同じであると100%確信しているわけではありません

ご協力いただきありがとうございます

4

1 に答える 1

4

場合strfldvar = 'BROKEN_ARROW' AND x = g(またはそうstrfldvarでないBROKEN_ARROW 場合 BROKEN_BOX)、y = gパーツは評価されません。これにより、クエリが予想よりも長く実行されているように見えます-最終的にあなた、クライアント、またはリソースの制限によって強制終了されるまで。どちらのテーブルからの結合条件であっても、それが唯一の結合条件であると思われるyため、最終的にはデカルト積になります。

その場合、とstrfldvar = 'BROKEN_BOX'の両方が評価されるため、とを提供するテーブルのいずれに対しても、同じデカルト積は得られません。x = gy = gxy

基本的に、そのフラグに基づいてクエリに含めるテーブルを決定している場合は、これを再設計する必要があります。1 つは に結合し、もう 1 つは に結合xyます。または個別のクエリを使用して、どちらを実行するかを決定します。または、外部結合を使用することもできます。ただし、実際に何をしようとしているか、およびデータがどのように見えるかによって異なります。あなたが示したコードは一般的すぎて、何が適切かを推測できません。

于 2013-08-28T13:41:55.427 に答える