首页 > 解决方案 > 需要使 NULL=Value 评估为 TRUE

问题描述

我有一个我正在尝试创建的维度表,当所有其他非空字段匹配时,它需要具有 NULL 的记录被一个值覆盖。

此逻辑有效并显示了我所说的“null = Value 评估为 TRUE”的意思:

UPDATE A
SET 
     A.SSN  =   COALESCE(A.SSN, B.SSN)      
    ,A.DOB  =   COALESCE(A.DOB, B.DOB)          
    ,A.ID_1 =   COALESCE(A.ID_1, B.ID_1)                
    ,A.ID_2 =   COALESCE(A.ID_2, B.ID_2)
    ,A.ID_3 =   COALESCE(A.ID_3, B.ID_3)
    ,A.ID_4 =   COALESCE(A.ID_4, B.ID_4)
FROM #TESTED1 A
    INNER JOIN #TESTED1 B
        ON  (A.SSN = B.SSN
            OR A.SSN IS NULL 
            OR B.SSN IS NULL)
        AND (A.DOB = B.DOB
            OR A.DOB IS NULL 
            OR B.DOB IS NULL)
        AND (A.ID_1 = B.ID_1
            OR A.ID_1 IS NULL 
            OR B.ID_1 IS NULL)
        AND (A.ID_2 = B.ID_2
            OR A.ID_2 IS NULL 
            OR B.ID_2 IS NULL)
        AND (A.ID_3 = B.ID_3    
            OR A.ID_3 IS NULL 
            OR B.ID_3 IS NULL)
        AND (A.ID_4 = B.ID_4    
            OR A.ID_4 IS NULL 
            OR B.ID_4 IS NULL)
WHERE A.ArbitraryTableID <> B.ArbitraryTableID 

但是评估的记录越多,所需的时间越长,10k 记录需要 9 秒,100k 记录需要 9 分钟,等等。我正在尝试进行大约 3000 万条记录的初始加载,然后我将不得不在 MERGE 操作中评估整个表每天还有另外 10k 条记录。

例如,我需要将以下三行(都存在于同一个表上)组合成两行,并填充所有值:
三记录示例

像这样:
三行示例已解决

不幸的是,成员可以有多个 ID,所以我不能指望这些 ID 中的任何一个是唯一的,甚至根本不存在来减少我的加入条件。

标签: sql-servernulldimension

解决方案


根据您对我的评论的回复,我建议以下解决方案:

  • 识别会员/客户的主记录
  • 每个主记录的子记录存储各自的 ID

将您的UPDATE陈述替换为

  • INSERTs 将表中所有A保证唯一的记录(例如 SSN)写入主表。
  • INSERTs 到子表中,用于表中A具有非 NULL ID 属性的所有记录
  • 通过引用主记录主键的外键列将表中的记录标记A为已处理UPDATEIDENTITY

  • INSERT进入子表中的所有记录A,您可以安全地分配给现有的主记录,然后再次设置 FK

此解决方案将解决由 5-way 导致的性能问题JOIN,并将已处理的源记录标记为已处理。


推荐阅读