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;

结果:
查询全部的结果

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 );

查询结果
经过查询结果确认,查询出来的数据就是需要删除的数据。

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条数据。

删除后的提示
我们再执行以下查询所有,可以看到,重复的数据已经被完全删除了。

select *from  class_name;

查询删除后的所有数据

4.总结

  • 重复判断的字段可以根据自己需要的逻辑添加,如我这次用到了三个字段判断重复,也可以用一个或更多来判断,只需要改sql中的字段即可。 防止讲述不清,需要改的被我在图中标出,如果id名字不相同也要改哦!
    需要修改的字段
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuyuanshun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值