需要使NULL =值计算为TRUE

问题描述 投票:0回答:1

我正在尝试创建一个维度表,当所有其他非null字段都匹配时,该表将要求使用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条记录需要9min,依此类推。我正在尝试进行大约3000万条记录的初始加载,然后我必须在每天进行MERGE操作并记录另外1万条记录。

例如,我需要以下两行(两者都存在于同一表中)才能合并为包含所有值的单行:Two Record Example不幸的是,成员可以有多个ID,所以我不能指望这些ID中的任何一个都是唯一的,甚至根本不存在以减少我的加入条件。

sql-server null dimension
1个回答
0
投票

为了获得该查询的性能,请确保您有一个索引对要加入的所有条件进行排序。

我做了一个简短的例子,描述了您的描述:

`声明@test表(row_name NVARCHAR(50),id1 int null,id2 int null,id3 int空)

插入@test值('row1',1,2,3),('row2',1,4,5),('row3',11,null,null),('row4',null, 4,null),('row5',3,6,5),('row6',3,null,null)

选择*来自@test t1内部连接@test t2 on((t1.id1 = t2.id1或t1.id1为null或t2.id1为空)和(t1.id2 = t2.id2或t1.id2为空或t2.id2为空)和(t1.id3 = t2.id3或t1.id3为空或t2.id3为空))其中t1.row_name <> t2.row_name通过t1.row_name`订购]

我在测试输出中看到几个可能的问题:

  1. row3和row4在我的示例中匹配,因为它们没有相同的ID。我猜这是不希望的,但是如果您确实有几个具有不同键的独立系统,那么是否有很多行属于这种情况?设置了id1且没有其他键的每一行,设置了id2且没有其他键的每一行都将匹配。
  2. row1和row4不匹配,即使它们应该通过传递性(row1.id1-> row2.id1,row2.id2-> row4.id2)
© www.soinside.com 2019 - 2024. All rights reserved.