SQL Server左连接

5

我尝试在一个查询中进行左连接,但似乎哪里出现了问题。

table machines
-------------- 
machineID
FaNo
Barcode
RoutingCode
Name


table log
-------------
logID
lineBarcode
machineBarcode

在日志表中,记录了机器和生产线的相关信息。一条生产线上可能会有许多不同类型的机器,而同一类型的机器也可能分布在不同生产线上。
机器的类型由routingCode标识,因此我想选择一条生产线上的所有机器并进行分组。只有不同routingCode的机器才应该单独显示,并且我想获取每种类型机器的数量。
实现方法如下:

SELECT routingcode, name, count(1)
FROM machines 
JOIN log ON log.machinebarcode = machines.barcode
WHERE log.linebarcode = 100000000001
GROUP BY routingcode, name

好的,一切都运转顺利,但是这种方法只能获取与 log 表相关并且根据 linebarcode 有记录的机器。
我认为如果我使用 LEFT JOIN 连接 log 表,我将会得到所有来自 machines 表的机器,并展示它们,当然,只有在 log 表中找到的机器才会有适当的计数,但实际上不是这样。
我犯了什么错误,如何找到一个合适的解决方案?

2个回答

4
你需要将对于 log 的条件放在 on 子句中而不是 where 中。对于左外连接所保留的不匹配行,将会通过 log 的所有列进行空扩展。
如果条件在 where 中,那么所有 log.linebarcodeNULL 的行将再次被删除。
此外,你需要计算一个来自于 log 的不会是 NULL 的列,而不是使用 COUNT(1)
SELECT routingcode,
       name,
       count(log.linebarcode)
FROM   machines
       LEFT JOIN log
         ON log.machinebarcode = machines.barcode
            AND log.linebarcode = 100000000001
GROUP  BY routingcode,
          name 

谢谢!我不知道我可以在连接上放很多条件。 :) - David White

-1

它会给你不同的机器名称,如路由代码和计数。

SELECT distinct name, routingcode, count(1)
FROM machines 
JOIN log ON log.machinebarcode = machines.barcode
WHERE log.linebarcode = 100000000001
GROUP BY routingcode, name

除了添加无意义的“distinct”和列重新排列之外,这与原始问题中的内容相同。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接