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