2010-06-23 79 views
0

我想从表格中删除其中包含多个Date字段值的条目。如何使用单个查询删除表中字段的重复值?

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

我想删除与同一日期字段中输入这应该是唯一的......只是清理 我只是需要保持为最新的一个条目,并删除其余.. 。如果可能,可能会保留最近的一个....

任何人都可以请建议更新查询来做到这一点?

+1

你想要保留哪一个 - 最高或最低ID值的记录? – 2010-06-23 21:09:05

+0

@OMG小马我想把最近的日期记录保存下来 – Vishal 2010-06-23 21:11:54

+0

是id的PK吗? – 2010-06-23 21:19:36

回答

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

+0

您确定您不需要表别名来从外部查询引用员工吗? (也就是说,不会将'date'错误地解释为'e.date'?) – meriton 2010-06-23 21:23:04

+0

@meriton:如果没有表别名,则假定没有别名的列被附加到该表。将主表别名为删除语句并不总是得到支持,所以我不按习惯去做。 – 2010-06-23 21:24:58

+0

我看到,很高兴知道:) – meriton 2010-06-23 21:26:39

1

如果你的表有主键,你可以通过DUP条件加入该表本身并筛选出更大的PK,类似如下:

delete e2 
from Employee e 
join Employee e2 on e.Date=e2.Date 
where e.ID < e2.ID 
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) 
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 
相关问题