【问题标题】:SQL Join returns empty recordsSQL Join 返回空记录
【发布时间】:2015-04-14 14:33:26
【问题描述】:

当表 B 上没有记录时,如何连接和池化两个表 A 和 B 的聚合数据。我只想为表 A 中的所有记录显示零,这些记录在表 B 中没有具有附加条件的匹配记录。在这种情况下,我想返回模型值为“汽车”的项目总数。当表 B 为空时会出现此问题。

这是我的代码 sn-p:

SELECT 10 as No,'Total' as Label, 
                SUM(CASE WHEN (a.year = b.year) THEN 1 ELSE 0 END) AS Value,
                (a.Year) as Year
FROM A a LEFT JOIN B b ON a.year = b.year
WHERE (isDeleted = 0 OR isdeleted is null) and b.model='cars'
GROUP BY a.year
order by YearMonth asc

【问题讨论】:

    标签: sql database sql-server-2008 join


    【解决方案1】:

    问题出在这里:

    WHERE (isDeleted = 0 OR isdeleted is null) and b.model='cars'
    

    如果b 为空,则b.model 将为null,并且您的 where 子句将过滤掉这些记录。您应该将该条件移至您的 JOIN 子句:

    FROM A a LEFT JOIN B b ON a.year = b.year and b.model='cars'
    WHERE (isDeleted = 0 OR isdeleted is null)
    

    请注意,您的 SUM 可以只是 COUNT,因为不计算空值:

    COUNT(b.year) AS Value,
    

    【讨论】:

    • 谢谢。值现在要显示,但 (a.Year) 将显示 null 作为年份。有什么解决办法吗?
    • A 中的年份是否有任何 null 值?如果是这样,你想用它们做什么?
    • 没有。我在 A 中列出了年份值。A 不能为空
    • @aby 然后我看不出你如何才能在(a.Year)返回 null。你确定你只是选择a.Year - 你没有调用任何函数或对其进行任何操作吗?
    • 我的错。很抱歉占用您的时间。我犯了一些小错误。现在,它就像一个魅力。谢谢
    【解决方案2】:

    将 b.model='cars' 从 WHERE 子句移动到 ON 子句(否则会执行常规内连接。)

    SELECT 10 as No,
           'Total' as Label, 
           SUM(CASE WHEN (a.year = b.year) THEN 1 ELSE 0 END) AS Value,
           (a.Year) as Year
    FROM A a LEFT JOIN B b ON a.year = b.year and b.model='cars'
    WHERE (isDeleted = 0 OR isdeleted is null) 
    GROUP BY a.year
    order by YearMonth asc
    

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2020-05-12
      • 2023-03-09
      相关资源
      最近更新 更多