欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-03 20:03:01
...

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

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

 

一:创建获得重复名称的且除了最小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

);

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

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

);

 

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

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

delete from book where bid in
(

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

);

 

4.结果如下:

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

 

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

相关标签: sql