postgreSql根据多个字段去重详细流程
这是测试表的建标语句,需要的可以拿去用。
CREATE TABLE "public"."class_name" ("id" int4 NOT NULL DEFAULT nextval('id'::regclass),"class_no" varchar(50) COLLATE "pg_catalog"."default","name" varchar(255) COLLATE "pg_catalog"."default","age" int4,CONSTRAINT "class_name_pkey" PRIMARY KEY ("id")
)
;ALTER TABLE "public"."class_name" OWNER TO "postgres";
1.首先看一下表结构,结果如下图。
select *from class_name;
结果:
2.为了确认数据不会被误删,我们可以先查询要删除的,看一下查询出来的结果,是不是我们要删除的。
查的是所查询的字段全部重复两次及以上的数据,直线式id较大的,重复的数据id最小的的保留,不现实到查询列表,及在下面删除时,重复数据的最小id不被删除。
--查询要删除的重复数据
SELECT*
FROMclass_name A
WHERE( A.class_no, A.NAME, A.age ) IN ( SELECT class_no, NAME, age FROM class_name GROUP BY class_no, NAME, age HAVING COUNT ( * ) > 1 ) AND A.ID NOT IN ( SELECT MIN ( ID ) FROM class_name GROUP BY class_no, NAME, age HAVING COUNT ( * ) > 1 );
经过查询结果确认,查询出来的数据就是需要删除的数据。
3.执行删除语句 基本和上面的sql语句相同,从查询改为删除。
--删除重复
DELETE
FROMclass_name A
WHERE( A.class_no, A.NAME, A.age ) IN ( SELECT class_no, NAME, age from class_name GROUP BY class_no, NAME, age HAVING COUNT ( * ) > 1 ) AND A.ID NOT IN ( SELECT MIN ( ID ) FROM class_name GROUP BY class_no, NAME, age HAVING COUNT ( * ) > 1 );
结果显示成功删除了3条数据。
我们再执行以下查询所有,可以看到,重复的数据已经被完全删除了。
select *from class_name;
4.总结
- 重复判断的字段可以根据自己需要的逻辑添加,如我这次用到了三个字段判断重复,也可以用一个或更多来判断,只需要改sql中的字段即可。 防止讲述不清,需要改的被我在图中标出,如果id名字不相同也要改哦!