如何删除SQL中的重复行

时间:2014-05-13 14:08:28

标签: sql sql-server sql-server-2008

我有以下数据:

Id: 1       Name:   apple       ForeignKey: 10
Id: 2       Name:   apple       ForeignKey: 10
Id: 3       Name:   apple       ForeignKey: 15
Id: 4       Name:   peach       ForeignKey: 11
Id: 5       Name:   peach       ForeignKey: 12

在我的情况下,具有相同Name和ForeignKey的行是重复的。现在我想从表中删除除一个实例之外的所有重复项。

换句话说;我想删除除了一行之外的所有行,其中Name和ForeignKey相等。

如果只有上部数据,则应删除具有Id 2 OR Id 1的行。

select count(Name), Name, ForeignKey group by Name, ForeignKey having count(Name)>1

我能够找到存在多个具有相同名称和外键的行的项目,但是如何获取这些行的ID?以及如何获取除具有相同Name和ForeignKey的该行的第一个/最后一个匹配项之外的那些行的ID?

3 个答案:

答案 0 :(得分:1)

如果数据库特定的答案,但这里是如何将表连接到自身:

delete t1
from yourtable t1
    join yourtable t2 on t1.id > t2.id
        and t1.name = t2.name 
        and t1.foreignkey = t2.foreignkey

答案 1 :(得分:0)

您也可以使用CTE&窗口函数,通过计算相同的行数来删除重复的行,然后删除除一个之外的所有行。

SQL Fiddle demo

;WITH myvals
AS (
    SELECT [id]
        ,[name]
        ,[foreignkey]
        ,ROW_NUMBER() OVER (
            PARTITION BY [name]
            ,[foreignkey] ORDER BY [id]
                ,[name]
                ,[foreignkey]
            ) AS inst_count
    FROM yourtable
    )
DELETE
FROM myvals
WHERE inst_count > 1;

答案 2 :(得分:0)

从中删除x (   select *,rn = row_number()over(按名称分区,按名称分配外键)   来自你的 ) X 其中rn> 1