【发布时间】:2010-10-10 08:58:36
【问题描述】:
我有两个表,如果第二个表中存在行的精确副本,我需要从第一个表中删除行。
有没有人有我将如何在 MSSQL 服务器中执行此操作的示例?
【问题讨论】:
标签: sql sql-server duplicate-data
我有两个表,如果第二个表中存在行的精确副本,我需要从第一个表中删除行。
有没有人有我将如何在 MSSQL 服务器中执行此操作的示例?
【问题讨论】:
标签: sql sql-server duplicate-data
嗯,在某些时候,您将不得不检查所有列 - 不妨加入...
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(*),但这只是帮助 - 您仍然需要检查实际值以排除哈希冲突。
【讨论】:
a 和表 b 出现在 view 中。那么我怎样才能删除重复的行并保持原来的一次呢?我已经在这种情况下发布了 [stackoverflow.com/questions/32065340/…。
我认为下面的伪代码会做到这一点..
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
不过,Chris 的 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
【讨论】: