连接多个表返回 NULL 值

Posted

技术标签:

【中文标题】连接多个表返回 NULL 值【英文标题】:Joining multiple tables returns NULL value 【发布时间】:2019-01-13 18:16:41 【问题描述】:

我有 3 种不同的 CTE 结果需要相互左连接:

主表 @Policies 包含所有 VehiclePolicyLimitsID 值:

@LiabilityPremium:

@HiredPremium:

作为一个例子,我将 CTE 的结果模拟成 3 个表变量:

declare @Policies table (VehiclePolicyLimitsID int)
insert into @Policies values (2101891),
                             (2101892),
                             (2101893),
                             (2101894),
                             (2119235),
                             (2119236),
                             (2119237),
                             (2119238),
                             (2190860),
                             (2190861),
                             (2190862),
                             (2190863)
--select * from @Policies


declare @LiabilityPremium  table (Quoteid int, ClassCode int, VehiclePolicyLimitsID int, LiabilityPremium money)
insert into @LiabilityPremium values (728436,3199,2101892,1723),
                                     (728436, 23199,2101893,1855),
                                     (728436,68199,2101894,133),
                                     (741626,3199,2119236,0),
                                     (741626,23199,2119237,0),
                                     (741626,68199,2119238,0),
                                     (774168,3199,2190861,0),
                                     (774168,23199,2190862,0),
                                     (774168,68199,2190863,0)
--select * from @LiabilityPremium

declare @HiredPremium  table (Quoteid int, ClassCode int, VehiclePolicyLimitsID int, LiabilityPremium money)
                    insert into @HiredPremium values ( 728436,  NULL,   2101891,    25),
                                                     (741626,   NULL,   2119235,    0),
                                                     (774168,   NULL,   2190860,    0)

--select * from @HiredPremium
    select 
            COALESCE(l.Quoteid,h.QuoteID,'') as QuoteID,
            COALESCE(l.ClassCode,h.ClassCode,'') as ClassCode,
            COALESCE(l.VehiclePolicyLimitsID,h.VehiclePolicyLimitsID,'') as VehiclePolicyLimitsID,
            l.LiabilityPremium + h.LiabilityPremium as LiabilityPremium
    from @Policies p
    left join @LiabilityPremium l ON l.VehiclePolicyLimitsID = p.VehiclePolicyLimitsID
    left join @HiredPremium h ON h.VehiclePolicyLimitsID = p.VehiclePolicyLimitsID

但由于某种原因,LiabilityPremium 的结果都是 NULL:

我希望结果看起来像这样,总 LiabilityPremium = $3,736

有什么方法可以加入以获得理想的结果吗?

【问题讨论】:

这是因为 NULL 加上 anything 始终为 NULL。在您的查询中,您可以在该等式的任一侧为 NULL,因为它们都使用左连接。将它们包裹在 ISNULL 或 COALESCE 中以防止出现 NULL。 @SeanLange 我认为回答了您的问题,但只是添加了赞成票,因为您的问题的格式非常好,带有数据示例和可执行脚本示例。很高兴看到。 辛苦学习了 :) 谢谢 【参考方案1】:

这是因为在加法运算符两侧的null 将产生null 的结果。您可以使用ISNULL(LiabilityPremium, 0) 示例:

ISNULL(l.LiabilityPremium,0) + ISNULL(h.LiabilityPremium,0) as LiabilityPremium

或者您可以使用COALESCE 代替ISNULL

COALESCE(l.LiabilityPremium,0) + COALESCE(h.LiabilityPremium,0) as LiabilityPremium

编辑

我不确定这是否与这个小数据集巧合或预期,但 如果 总是预计 @LiabilityPremium.LiabilityPremium@HiredPremium.LiabilityPremium 将始终为空,那么没有必要执行加法。而是直接在这两列上使用COALESCE

COALESCE(l.LiabilityPremium, h.LiabilityPremium) as LiabilityPremium

【讨论】:

【参考方案2】:
COALESCE(l.LiabilityPremium,0) + COALESCE(h.LiabilityPremium,0) as LiabilityPremium

【讨论】:

【参考方案3】:

那是因为

l.LiabilityPremium + h.LiabilityPremium

如果两者中的任何一个为 NULL,则表达式为 NULL。

这个表达式应该可以修复它

COALESCE(l.LiabilityPremium, 0.00) + COALESCE(h.LiabilityPremium, 0.00)

【讨论】:

以上是关于连接多个表返回 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

使用 DISTINCT 值连接表的 SQL

在 Postgres 中更新左连接表的 NULL 值

Presto - 使用唯一标识符连接多个表

数据库操作中,左连接,右连接是啥意思,举例说明

Postgres为连接表的array_agg返回[null]而不是[]