【问题标题】:How to delete duplicate values for a field in a table with a single query?如何使用单个查询删除表中字段的重复值?
【发布时间】:2010-06-23 21:03:37
【问题描述】:

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

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

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

谁能建议一个更新查询来做到这一点?

【问题讨论】:

  • 你要保留哪一条——ID值最高或最低的记录?
  • @OMG Ponies 我希望保留最近的日期记录

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


【解决方案1】:

用途:

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

【讨论】:

  • 您确定不需要表别名来引用外部查询中的员工吗? (也就是说,date 会不会被错误地解释为e.date?)
  • @meriton:如果没有表别名,则假定没有别名的列附加到该表。始终不支持将主表别名为删除语句,因此我不习惯这样做。
  • 看起来这样可行,然后您可以使用相同的 SQL 创建一个触发器,以便在插入具有相同日期的新记录时清除旧记录。这样,您的数据库就可以保持最新状态,而无需执行手动维护任务。
  • 我不认为将日期分组是一个明智的想法,因为您首先在同一个日期下有不同的名称,并且每个日期都有一个秒甚至毫秒的部分。尝试按名称分组
  • @Waleed A.K.:说实话,我们的信息非常模糊。 OP 的要求显然是“保存的最近日期记录”; name 可以是任何文本,id 更可能是两者中的标识值。
【解决方案2】:

此查询查看具有相同 Id、Name 和 Points 的记录,并删除除最新之外的所有记录

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以使用

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-09
        • 2011-08-21
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多