我正在对复杂的数据库进行查询:
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和,它可以在两个单独的查询运行中正常工作。案例 strfldvar ='BROKEN_ARROW'的错误消息是:
ORA-01013:用户请求取消当前操作
在出现此错误消息之前,计算机会深入思考我猜2分钟。
我在这里做错了什么?
f.y.i。我看了两个单独运行的字段的名称,它们看起来很理想。我的意思是输出的两种情况看起来都一样。但我不是百分百肯定他们是一样的,如果这很重要,那就是。
感谢您的帮助
答案 0 :(得分:4)
当strfldvar = 'BROKEN_ARROW' AND x = g
(或strfldvar
不是BROKEN_ARROW
或 BROKEN_BOX
)时,y = g
部分未被评估,这似乎导致查询运行的时间超出预期 - 直到它最终被您,您的客户端或资源限制杀死。我怀疑这是y
来自哪个表的唯一连接条件,所以你最终会得到一个笛卡尔积。
当strfldvar = 'BROKEN_BOX'
时,x = g
和y = g
将被评估,因此您不会在提供x
和{的任何一个表格中获得相同的笛卡尔积{1}}。
如果您基本上是根据该标志决定在查询中包含哪个表,那么您需要重新设计它;可能有两个查询的并集,一个连接到y
,另一个连接到x
;或者使用单独的查询,然后决定运行哪个;或者甚至可能是外连接。但这取决于你真正想做什么以及数据是什么样的。您展示的代码太过通用,无法猜测什么是合适的。