【问题标题】:Count() and left join problemsCount() 和左连接问题
【发布时间】:2017-03-23 09:21:42
【问题描述】:

我正在尝试加入两个表,同时使用 count 函数来获取正确表中的数字。我认为这正是 LEFT JOIN 的用途,但在这种情况下它根本不起作用。

问题的简化版

表 1:

ID   Data
1    Blah 
2    Blaha
3    Blahah

表 2:

ID  Some Data
1   xxxx
1   xxxx
1   xxxx
1   xxxx
1   xxxx
3   xxxx
3   xxxx
3   xxxx
3   xxxx
3   xxxx

我使用的查询是:

SELECT table1.ID, count(table2.ID) As Count
FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.ID
GROUP BY table1.ID 

我要显示:

ID  Count
1   5
2   0
3   5

但我只能显示:

ID  Count
1   5
3   5

干杯

【问题讨论】:

  • 您的查询看起来不错。确定按table1.id分组吗?
  • 您确定您使用的是左连接而不是内连接吗?
  • 您的查询给了我正确的结果。您确定 table1 位于连接的左侧吗?
  • 您的查询运行良好。
  • 好的,非常感谢。真正的查询要大得多,尽管选择了“table1.ID”,但我错过了我在“table2.ID”上分组的情况。这可以关闭

标签: sql sql-server count left-join


【解决方案1】:

检查 counttable2.ID 是否返回 null 并在这种情况下返回 0

SELECT table1.ID, IFNULL(count(table2.ID), 0) As Count
FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.ID
GROUP BY table1.ID 

【讨论】:

  • 对不起,我忘了说,我已经尝试过 (isnull ,0) 仍然没有返回
【解决方案2】:

这将起作用:

SELECT table1.ID, count(coalesce(table2.ID,'Dummy')) As Count
FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.ID
GROUP BY table1.ID

目前,您的查询发生的情况是count(table2.ID) 只计算空值,为了计算空值,我使用了 coalesce 函数,因此如果值为空,则该函数返回 dralult 值,即。 'Dummy' 随机文本。你也可以得到nvl。为了获得更好的性能,您可以选择coalesce

最重要的是 count(*)

【讨论】:

    【解决方案3】:

    如果你使用count(id),它只会计算不为NULL的id。试试下面的例子:

    SELECT      COUNT(1)
    ,           COUNT(x.id)
    FROM        (
                    SELECT      1 id UNION ALL
                    SELECT      NULL
                ) x
    

    结果为@​​987654323@。

    因此,如果您使用COUNT(1),您将获得预期的结果。你也可以使用coalesceisnull,但如果你真的不需要函数的结果,我看不出使用函数的意义。

    【讨论】:

      【解决方案4】:

      您不需要加入。 达到预期结果的最简单方法:

      SELECT table1.ID, 
        (SELECT count(*) FROM table2 WHERE table1.ID = table2.ID) As Counter
      FROM table1 
      

      假设table1中的id值是唯一的。

      如果 table1.ID 不是唯一的,您可以使用 DISTINCT 关键字:

      SELECT DISTINCT table1.ID, 
        (SELECT count(*) FROM table2 WHERE table1.ID = table2.ID) As Counter
      FROM table1 
      

      【讨论】:

        猜你喜欢
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多