左连接未显示所有左表值

时间:2012-10-01 14:23:45

标签: sql join left-join

LEFT JOIN应显示左表中的所有行,但是在运行以下查询时,我只获取位数为1或更多的位置值。请有人给我一些关于我可能出错的地方的指导:

SELECT places.placeId,
       placeName,
       COUNT(orderId) AS orderCount
FROM   places
       LEFT JOIN orders
         ON places.placeId = orders.placeId
WHERE  places.companyId = 1
       AND stateId = 1
       AND orderstateId = 1
       AND orderName NOT LIKE 'Delivery%'
GROUP  BY places.placeId,
          places.placeName
ORDER  BY orderCount DESC,
          placeName ASC 

提前致谢

4 个答案:

答案 0 :(得分:18)

您的WHERE条件会将OUTER JOIN转换回INNER JOIN

对于所有NULL列,不匹配的行将为orders,并由WHERE子句删除。试试这个。

SELECT places.placeId,
       placeName,
       COUNT(orderId) AS orderCount
FROM   places
       LEFT JOIN orders
         ON places.placeId = orders.placeId
       AND orders.stateId = 1
       AND orders.orderstateId = 1
       AND orders.orderName NOT LIKE 'Delivery%'
WHERE  places.companyId = 1
GROUP  BY places.placeId,
          places.placeName
ORDER  BY orderCount DESC,
          placeName ASC 

答案 1 :(得分:1)

如果这些列stateIDorderstateIDOrderName来自ORDERS表,那么您将遇到问题。如您所见,如果places.placeID表中没有orders,则nulls表的以下列为orders。这就是为什么由于您在orders表上提供的条件而无法显示某些记录的原因。

答案 2 :(得分:0)

你在说orderstateId = 1。我想这会绑定到orders.orderstateId = 1。对于空orderstateId,此条件失败,这在左连接时不匹配时发生。

将其更改为orders.orderstateId = 1 OR orders.orderstateId IS NULL

答案 3 :(得分:0)

即使使用LEFT JOIN,所有行都必须符合WHERE子句中的条件。在这种情况下,WHERE子句具有与orders相关的要求,因此您不会返回ordersplaces不匹配的任何行。

一个简单的解决方法是允许空值满足WHERE子句:

orderstateId = 1

更改为

(orderstateId is NULL or orderstateId = 1)

同样适用于其他变量。

这可能会做你想要的,但是你必须检查orders表中是否包含空值的行,然后弄乱你的结果。以另一种方式重新设计查询可能会更好。