数据库去重--通过取得重复字段的非最小主键(id)来删除

数据库一张表如下,表名为book,要求:去除重复的name,保留一个。

 

一:创建获得重复名称的且除了最小bid的所有重复bid的视图。(有点绕哈哈),类似如下:

1.找出所有重复的所有bid(为了可观我加了name):

//根据找到重复的name,再冲Book表找到bid主键
select bid,name from book where name in 
(
        //找到计数大于1的,即有重复的name
		select t.name from (     
		select name,count(*) as dise from book group by name
		) t where t.dise>1

);

2.根据一的结果可以创建视图:非最小重复name的所有bid,即上图除了2和6的所有bid。


CREATE VIEW diff_remove AS        //视图名为diff_remove

select h.bid from (      //嵌套一层查询以免报mysql才会出现的错误=。=
    
	select bid from book where name in         //找到所有重复name的Bid
	(
        
		select t.name from (
		select name,count(*) as dise from book group by name
		) t where t.dise>1

	)

) h where bid not in         //在所有重复name的Bid中取非最小Bid

(

	select min(bid) from book where name  in     //取得所有重复name的Bid中最小的Bid
	(

		select t.name from (
		select name,count(*) as dise from book group by name
		) t where t.dise>1

	) group by name

);

 

3.获得id后就可以直接在book表根据条件删除啦!

delete from book where bid in
(

	select t.bid from (select bid from diff_remove) t

);

 

4.结果如下:

 

5.可以改进的地方,可以把“找到所有重复name的Bid”也创建一个视图,减少重复代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值