我有一个非常简单的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.
有没有人知道为什么会发生这种情况?
答案 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
名称?