迭代删除重复记录

时间:2017-11-06 13:03:06

标签: sql postgresql

对于表中的每个user_id(组),我想删除除每组中ID最高的记录之外的所有记录。类似于此的内容:Delete all records except the most recent one?

就我而言,它看起来像:

DELETE FROM logins
WHERE user_id IS NOT NULL AND id NOT IN (SELECT MAX(id) FROM logins WHERE user_id IS NOT NULL GROUP BY user_id)

问题是,该表保存了100多个记录,因此在单个查询中执行此操作是不可能的性能。

我可以采取哪些其他方式,例如:在一些批次?

1 个答案:

答案 0 :(得分:0)

我倾向于将delete标记为:

DELETE FROM logins l
    WHERE l.user_id IS NOT NULL AND
          l.id <> (SELECT MAX(l2.id)
                   FROM logins l2
                   WHERE l2.user_id = l.user_id
                  );

这可以轻松利用logics(user_id, id)上的索引。但是,如果要删除大量行,通常最好截断表并重新创建:

create table temp_logics as
    select l.*
    from logins
    where l.id = (SELECT MAX(l2.id)
                  FROM logins l2
                  WHERE l2.user_id = l.user_id
                 );

truncate table logins;

insert into logins
    select * from temp_logins;

如果采用这种方法,请务必在截断第二个表之前验证temp_logins。实际上,您不希望为中间表使用临时表,因为数据库可能会发生某些事情 - 您将丢失数据。