例如,我有一个带有这些表的大型SQL数据库:
first_name | last_name | email | country | created_at
-----------------------------------------------------------------
john | DOE | johndoe@email.com | USA | 2016-05-01
john | DOE | johndoe@email.com | FRANCE | 2019-05-03
doe | John | johndoe@email.com | CANADA | 2011-08-23
以前的数据库是在没有唯一电子邮件的情况下构建的(是的,这太可怕了)。 因此,我需要用相同的电子邮件将用户合并,但将最新记录与不同的数据合并。
然后通过删除较旧的数据库并保留最新的数据库来更新数据库。
如果不清楚,不好意思。
答案 0 :(得分:4)
像这样吗?
delete t
where t.created_at < (select max(t2. created_at)
from t t2
where t2.email = t.email
);
答案 1 :(得分:1)
使用EXISTS
:
delete tablename t
where exists (
select 1 from tablename where email = t.email and created_at > t.created_at
)
EXISTS
将在发现1行具有相同电子邮件并且日期大于当前行的日期后立即返回TRUE
,因此不需要扫描整个表的每一行。
答案 2 :(得分:0)
您提到这是一个很大的数据库。然后,我建议您在通过@forpas或@Gordon Linoff运行脚本之前,在表上添加索引,因为处理数百万行时这些脚本可能需要很长时间才能完成。
可以这样创建索引:
CREATE INDEX tablename_index ON tablename (email, created_at);
然后,如果您不再需要该索引,则可以像这样删除它:
DROP INDEX tablename_index ON tablename;