如何使用单个查询删除表中字段的重复值?

时间:2010-06-23 21:03:38

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

我想从表中删除日期字段有多个值的条目。

所以说我有Employee table - Id,Name,Date,Points

我想删除具有相同Date字段的条目,该字段应该是唯一的......只是为了清理 我需要保留一个日期条目并删除其余条目......如果可能的话,可以保留最近的条目....

任何人都可以建议更新查询来执行此操作吗?

4 个答案:

答案 0 :(得分:4)

使用:

DELETE FROM EMPLOYEE
 WHERE id NOT IN (SELECT MAX(e.id)
                    FROM EMPLOYEE e
                   WHERE e.date = date
                GROUP BY e.date)

由于WHERE子句和&而且GROUP BY不太可能是必要的。只返回一个带有聚合函数的列,但它包含在内是安全的。这假设当OP表示日期字段时,SQL Server 2008表示DATE data type,而不是DATETIME

答案 1 :(得分:2)

此查询查看具有相同ID,名称和点数的记录,并删除除最新

之外的所有记录
with cte as(
    select id,Name, Date, Points,row_number() over(
       partition by id,name,points order by date desc) as ind
    from emp)

    delete from cte where ind>1

答案 2 :(得分:1)

如果您的表具有主键,您可以通过dup条件将表连接到自身并过滤掉更多的PK,如下所示:

delete e2
from Employee e
join Employee e2 on e.Date=e2.Date
where e.ID < e2.ID

答案 3 :(得分:0)

你可以使用

DELETE
From Employee 
WHERE ID not in (select max(ID) from Employee group by Name)

如果最后一个条目是最近的日期,或者您可以使用此代码

DELETE
From Employee 
WHERE ID not in 
(select max(ID) from Employee e1 
where Date=(select max(Date) From Employee where Name=e1.Name) 
group by Name)