You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中关联列含NULL时多列关联的解决方法

解决SQL Server中NULL值导致关联字段异常为空的问题

在SQL Server中对两张表进行多列关联时,因ProviderID列存在NULL值,导致关联结果中部分记录的City_Name、State_Name、Hospital_Name字段异常显示为NULL,不符合预期。

现有数据集

主表#df

CREATE TABLE #df 
(
    CityID bigint,
    StateID VARCHAR (5),
    HospitalID bigint,
    ProviderID BIGINT,
    PT_Count BIGINT 
);

INSERT INTO #df (CityID, StateID, HospitalID, ProviderID, PT_Count)
VALUES
(70289, 'WY', 10001, 34523, 300),
(70500, 'AZ', 15000, NULL ,200),
(34523, 'NM', 54634, 78543, 100),
(90010, 'CA', 65738, NULL, 500)

关联表#df2

CREATE TABLE #df2 
(
    CityID bigint,
    City_Name VARCHAR(20),
    StateID VARCHAR (5),
    State_Name VARCHAR(20),
    HospitalID bigint,
    Hospital_Name VARCHAR(20),
    ProviderID BIGINT,
    Provider_Name VARCHAR(20)
);

INSERT INTO #df2 (CityID, City_Name, StateID, State_Name, HospitalID, Hospital_Name, ProviderID, Provider_Name)
VALUES
(70289, 'Cheyenne', 'WY', 'Wyoming', '10001', 'Wyoming Gen', 34523, 'Dr.Joe'),
(70500, 'Phoenix', 'AZ', 'Arizona', 15000, 'Arizona Gen', NULL, NULL),
(34523, 'Santa Fe', 'NM', 'New Mexico', '54634', 'NM Gen',78543, 'Dr. Jim'),
(90010, 'Beverly Hills', 'CA', 'California', 65738, 'Bev Gen', NULL, NULL)

问题查询语句

执行以下查询时,ProviderID为NULL的记录对应的City_Name、State_Name、Hospital_Name均返回NULL:

SELECT a.CityID
     , b.City_Name
     , a.StateID
     , b.State_Name
     , a.HospitalID
     , b.Hospital_Name
     , a.ProviderID
     , b.Provider_Name
     , a.PT_Count
FROM #df a
LEFT JOIN #df2 b ON b.CityID = a.CityID 
                 AND b.HospitalID = a.HospitalID 
                 AND b.ProviderID = a.ProviderID 
                 AND b.StateID = a.StateID

问题原因

SQL中NULL不等于任何值,包括NULL本身,当a.ProviderID为NULL时,b.ProviderID = a.ProviderID这个条件永远无法成立,导致无法匹配到#df2中对应的记录,进而使关联字段返回NULL。

修复方案

方案一:显式判断NULL相等

修改关联条件,当两边ProviderID均为NULL时视为匹配:

SELECT a.CityID
     , b.City_Name
     , a.StateID
     , b.State_Name
     , a.HospitalID
     , b.Hospital_Name
     , a.ProviderID
     , b.Provider_Name
     , a.PT_Count
FROM #df a
LEFT JOIN #df2 b ON b.CityID = a.CityID 
                 AND b.HospitalID = a.HospitalID 
                 AND b.StateID = a.StateID
                 AND (b.ProviderID = a.ProviderID OR (b.ProviderID IS NULL AND a.ProviderID IS NULL))

方案二:用占位值替换NULL后比较

使用ISNULL函数将NULL替换为一个不会出现在实际数据中的值(比如-1,假设ProviderID均为正整数),再进行比较:

SELECT a.CityID
     , b.City_Name
     , a.StateID
     , b.State_Name
     , a.HospitalID
     , b.Hospital_Name
     , a.ProviderID
     , b.Provider_Name
     , a.PT_Count
FROM #df a
LEFT JOIN #df2 b ON b.CityID = a.CityID 
                 AND b.HospitalID = a.HospitalID 
                 AND b.StateID = a.StateID
                 AND ISNULL(b.ProviderID, -1) = ISNULL(a.ProviderID, -1)

两种方案都能正确匹配ProviderID为NULL的记录,返回预期的City_Name、State_Name和Hospital_Name值。

内容的提问来源于stack exchange,提问作者Trevor M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:44:57