比较两个用于唯一单元格的SQL表和更新主表

时间:2018-01-22 06:07:10

标签: sql-server database

我正在使用SQL Server 2017,并且我一直在努力解决这个问题。我的目标是比较2个表,只插入基于UNIQUE单元格的NEW行。所有列都有一个ID号,但我没有分配主键。我的目标是只在没有条件匹配的情况下添加包含UNIQUE单元格的额外行。这就是我的表格现在的设置方式。

旧数据(表名为Test1)

FName  LNname   Address    City   State  Zipcode   Phone          Phone2    ID
Frank  Smith    444 Main  Y'all   TX     77484     281-788-9898   NULL      1
Thomas Parker   343 Tire  Y'all   TX     77484     281-788-5453   NULL      2
Ben    Krull    232 Wheel Y'all   TX     77484     281-788-9535   NULL      3

新数据(表名为Test2)

FName  LNname   Address    City State Zipcode  Phone          Phone2       ID
Frank  Smith    444 Main  Y'all TX    77484    281-788-9898   NULL         1
Thomas Parker   343 Tire  Y'all TX    77484    281-788-5453   NULL         2
Ben    Krull    232 Wheel Y'all TX    77484    281-788-9535   NULL         3
Juan   Roberto  444 Gas   Y'all TX    77484    281-788-3434   NULL         4
Ben    Krull    232 Wheel Y'all TX    77484    281-788-9535   713-545-4353 5

如您所见,ID 1,2和3在两个表中都是相同的。由于Phone2条目,ID-4是一个完全唯一的行,ID-5也是如此。我找到了一些代码并对其进行了一些修改以匹配我关心的标题,以帮助我确定哪些条目是重复的。这个代码一直让我发疯。

INSERT TEST1 (Name 
    ,Last_Name 
    ,Address 
    ,City 
    ,State 
    ,Zip_Code 
    ,Phone 
    ,Phone2 
)
SELECT Name
    ,Last_Name 
    ,Address 
    ,City 
    ,State 
    ,Zip_Code 
    ,Phone 
    ,Phone2 

FROM TEST2
WHERE TEST2.NAME not in (select Name from test1)
AND   TEST2.Address not in (select Address from test1)
AND   TEST2.City not in (select City from test1)
AND   TEST2.State not in (select State from test1)
AND   TEST2.Zip_Code not in (select Zip_Code from test1)
AND   TEST2.Phone not in (select Phone from test1)
AND   TEST2.Phone2 not in (select phone2 from test1)

我尝试匹配所有字段,如果找到唯一的CELL,则将新行输入old_data表。执行它后我没有看到任何错误,但也没有任何反应。有趣的是,如果我删除行下面的所有代码," WHERE TEST2.NAME不在(从test1中选择Name)" ID-4(胡安罗伯托)被转移,但ID-5没有任何反应。

我真的开始认为WHERE不能用于比较重复项并修改或添加条目,但我可能错了。合并功能会很棒,但我对前者非常满意,因为我总是可以运行不同的脚本来清理表格以获得欺骗。我希望有人能够指出我正确的方向,因为我在不同的表中有数百万行需要进行比较和修剪。谢谢。

1 个答案:

答案 0 :(得分:0)

试试以下代码,我不确定它是否会对你有用,因为我没有测试过它

SELECT * INTO #TEMP FROM Test2(NOLOCK);

DELETE #TEMP
FROM   #TEMP
       INNER JOIN Test1
           ON #TEMP.NAME = Test1.NAME
              AND #TEMP.Address = Test1.Address
              AND #TEMP.City = Test1.City
              AND #TEMP.State = Test1.State
              AND #TEMP.Zip_Code = Test1.Zip_Code
              AND #TEMP.Phone = Test1.Phone
              AND #TEMP.Phone2 = Test1.Phone2 ;

INSERT INTO Test1
SELECT * FROM #TEMP;