在WHERE之后使用OR的sql查询输出不一致

时间:2013-08-28 13:01:09

标签: sql oracle

我正在对复杂的数据库进行查询:

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。我看了两个单独运行的字段的名称,它们看起来很理想。我的意思是输出的两种情况看起来都一样。但我不是百分百肯定他们是一样的,如果这很重要,那就是。

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

strfldvar = 'BROKEN_ARROW' AND x = g(或strfldvar不是BROKEN_ARROW BROKEN_BOX)时,y = g部分未被评估,这似乎导致查询运行的时间超出预期 - 直到它最终被您,您的客户端或资源限制杀死。我怀疑这是y来自哪个表的唯一连接条件,所以你最终会得到一个笛卡尔积。

strfldvar = 'BROKEN_BOX'时,x = gy = g将被评估,因此您不会在提供x和{的任何一个表格中获得相同的笛卡尔积{1}}。

如果您基本上是根据该标志决定在查询中包含哪个表,那么您需要重新设计它;可能有两个查询的并集,一个连接到y,另一个连接到x;或者使用单独的查询,然后决定运行哪个;或者甚至可能是外连接。但这取决于你真正想做什么以及数据是什么样的。您展示的代码太过通用,无法猜测什么是合适的。