如何比较两个表并删除SQL中的重复行?

问题描述:

我有两个表,我需要从第一个表中删除行,如果在第二个表中存在一个行的确切副本。如何比较两个表并删除SQL中的重复行?

有没有人有我如何去在MSSQL服务器这样做的例子?

嘛,在某些时候你将必须检查所有的列 - 还不如让加盟...

DELETE a 
FROM a -- first table 
INNER JOIN b -- second table 
     ON b.ID = a.ID 
     AND b.Name = a.Name 
     AND b.Foo = a.Foo 
     AND b.Bar = a.Bar 

应该这样做......还有CHECKSUM(*),但这只有有助于 - 您仍然需要检查实际值以排除散列冲突。

+5

这只要没有任何列包含空值很好地工作。一旦发生这种情况,您必须开始处理复杂的条件,例如(a.Name = b.Name OR(a.Name IS NULL AND b.Name IS NULL))。另一个避免null的原因。 – 2009-03-02 00:39:12

我觉得下面的伪代码会做吧..

DELETE FirstTable, SecondTable 
FROM FirstTable 
FULL OUTER JOIN SecondTable 
ON FirstTable.Field1 = SecondTable.Field1 
... continue for all fields 
WHERE FirstTable.Field1 IS NOT NULL 
AND SecondTable.Field1 IS NOT NULL 

克里斯的INTERSECT后是更为优雅,虽然,我会使用,在未来,而不是写出来的所有外部的连接标准:)

我会尝试一个DISTINCT查询并做两个表的联合。

您可以使用像asp/php这样的脚本语言将输出格式化为一系列插入语句,以便重建生成的唯一数据表。

如果您使用SQL Server 2005中,你可以使用intersect

delete * from table1 intersect select * from table2 

试试这个:

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id