postgreSql根据多个字段去重详细流程

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;

结果:
postgreSql根据多个字段去重详细流程_第1张图片

2.为了确认数据不会被误删,我们可以先查询要删除的,看一下查询出来的结果,是不是我们要删除的。

查的是所查询的字段全部重复两次及以上的数据,直线式id较大的,重复的数据id最小的的保留,不现实到查询列表,及在下面删除时,重复数据的最小id不被删除。

--查询要删除的重复数据
SELECT
	* 
FROM
	class_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 );

postgreSql根据多个字段去重详细流程_第2张图片
经过查询结果确认,查询出来的数据就是需要删除的数据。

3.执行删除语句 基本和上面的sql语句相同,从查询改为删除。

 --删除重复
DELETE 
FROM
	class_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条数据。

postgreSql根据多个字段去重详细流程_第3张图片
我们再执行以下查询所有,可以看到,重复的数据已经被完全删除了。

select *from  class_name;

postgreSql根据多个字段去重详细流程_第4张图片

4.总结

  • 重复判断的字段可以根据自己需要的逻辑添加,如我这次用到了三个字段判断重复,也可以用一个或更多来判断,只需要改sql中的字段即可。 防止讲述不清,需要改的被我在图中标出,如果id名字不相同也要改哦!
    postgreSql根据多个字段去重详细流程_第5张图片

你可能感兴趣的:(PostgreSql)