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 并且它在两个单独的查询中运行良好。案例strfldvar = 'BROKEN_ARROW'的错误消息是:

ORA-01013: 用户请求取消当前操作

在此错误消息出现之前,计算机会深入思考 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 = g将被评估,所以你不会得到相同的笛卡尔积,针对提供x和的任何一个表y

如果您实际上是根据该标志决定要在查询中包含哪个表,那么您需要重新设计它;可能有两个查询的联合,一个连接到,另一个连接xy;或使用单独的查询,您决定运行哪个;或者甚至可以使用外部连接。但这取决于您真正想做的事情以及数据的样子。您显示的代码太笼统,无法猜测什么是合适的。

于 2013-08-28T13:41:55.427 回答