连接多个表返回 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 值的主要内容,如果未能解决你的问题,请参考以下文章