【问题标题】:SQL Server left joiningSQL Server 离开加入
【发布时间】:2013-07-17 08:48:32
【问题描述】:

我正在尝试在一个查询中进行左连接,但似乎我在某处错了。

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 日志表,我将从machines 表中获取所有机器并显示它们,当然只有在log 表中找到的机器将具有正确的count,但没有。 我在哪里弄错了,如何找到合适的解决方法?

【问题讨论】:

    标签: sql-server join count group-by subquery


    【解决方案1】:

    您需要将log 的条件放入on 子句而不是where。左外连接保留的不匹配行将对log 中的所有列进行空扩展。

    如果条件在where 中,将再次删除log.linebarcodeNULL 行。

    另外,您需要计算来自log 的列而不是COUNT(1),而不是NULL

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

    【讨论】:

    • 谢谢!我不知道我可以对加入设置很多条件。 :)
    【解决方案2】:

    它为您提供不同的机器名称,即路由代码和计数

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

    【讨论】:

    • 除了添加无意义的distinct 和列重新排列之外,这与原始问题中的内容相同。
    猜你喜欢
    • 2016-04-27
    • 2017-12-04
    • 2022-09-24
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多