PostgreSQL:如何删除tblperson表中的重复记录?
要删除你筛选出的(未出现在tblorder表中)重复记录里的第二条(对应按ID升序排序后的同姓名组中ID更大的那条),可以在你提供的删除示例基础上,加上范围筛选条件,具体SQL语句如下:
DELETE FROM tblperson dup_lang USING tblperson dist_lang WHERE dup_lang.firstname = dist_lang.firstname AND dup_lang.lastname = dist_lang.lastname -- 指定删除ID更大的那条,对应排序后的第二条重复记录 AND dup_lang.id > dist_lang.id -- 确保被删除的记录不在tblorder表中 AND NOT EXISTS (SELECT 1 FROM tblorder p WHERE p.id = dup_lang.id) -- 确保用来对比的基准记录也在目标范围内 AND NOT EXISTS (SELECT 1 FROM tblorder p WHERE p.id = dist_lang.id);
如果你的需求是保留ID更大的那条、删除排序后的第一条(ID更小的重复记录),只需要把dup_lang.id > dist_lang.id改成dup_lang.id < dist_lang.id即可。
这条语句的核心逻辑:通过关联同表找出姓名重复的记录对,用ID大小确定删除目标,再通过NOT EXISTS限定只处理未出现在tblorder里的记录,避免误删其他数据。
内容的提问来源于stack exchange,提问作者BoS
相关产品推荐
相关产品推荐

