比较两个 SQL 表的唯一单元格并更新主表



我正在使用SQL Server 2017,我已经尝试了几个小时。我的目标是比较 2 个表格,并且只插入基于唯一单元格的新行。所有列都有一个 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 在两个表中是相同的。ID-4 是一个完全唯一的行,ID-5 也是如此,因为 Phone2 条目。我找到了一些代码并对其进行了一些修改以匹配我关心的标题,以帮助我确定哪些条目是重复的。这是一直让我发疯的代码。

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 not in (从test1中选择名称)"一行下面的所有代码,ID-4(Juan Roberto)将被转移,但ID-5没有任何反应。

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

只需尝试以下代码,我不确定它是否适合您,因为我没有经过测试。

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;

最新更新