LEFT JOIN冻结查询执行

时间:2016-02-10 08:46:10

标签: java sybase

我有一个非常简单的SQL查询:

SELECT  o.description, oi.description, cu.name
FROM dbo.order o 
LEFT JOIN dbo.orderitem oi o.orderItemId = oi.orderItemId
INNER JOIN dbo.customer cu on cu.customerId = o.customerId
WHERE cu.id = 12345

该查询每次都有效。

如果我将INNER JOIN更改为LEFT JOIN ...

LEFT JOIN dbo.customer cu on cu.customerId = o.customerId

然后当我用Java(通过REST)调用它时总是冻结,如果我使用我的SQL客户端,有时冻结。有时它只使用完全相同的搜索参数,并按预期返回几行(< 10)。

冻结意味着它甚至不会开始计算我的SQL客户端(SQuirreL)中的执行时间,并且当我用Java调用它时它会遇到超时。

但如果我添加第二个WHERE子句(如

),它将再次起作用
SELECT  o.description, oi.description, cu.name
FROM dbo.order o 
LEFT JOIN dbo.orderitem oi o.orderItemId = oi.orderItemId
LEFT JOIN dbo.customer cu on cu.customerId = o.customerId
WHERE cu.id = 12345
AND o.someOtherId = 3456

或完全删除cu.id.

有没有人知道为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

我没有得到这条线..

  LEFT JOIN dbo.orderitem am oi o.orderItemId = oi.orderItemId

你认为不应该这样:

LEFT JOIN dbo.orderitem oi on o.orderItemId = oi.orderItemId

你能试试吗?

答案 1 :(得分:0)

这是因为customer上的左连接使where子句失效;查询将返回所有 order s,所有 orderitem s,但仅适用于order的{​​{1}} 12345,它还将返回customer名称。

也许你想改为customer,所以即使他没有right join,你也会获得customer名称?