SQL删除重复的数据

建表:

-- ----------------------------
-- Table structure for duplicaterow
-- ----------------------------
DROP TABLE IF EXISTS `duplicaterow`;
CREATE TABLE `duplicaterow` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of duplicaterow
-- ----------------------------
INSERT INTO `duplicaterow` VALUES ('1', 'a', 'aa');
INSERT INTO `duplicaterow` VALUES ('2', 'a', 'aa');
INSERT INTO `duplicaterow` VALUES ('3', 'b', 'bb');
INSERT INTO `duplicaterow` VALUES ('4', 'b', 'bb');
INSERT INTO `duplicaterow` VALUES ('5', 'b', 'zz');
INSERT INTO `duplicaterow` VALUES ('6', 'c', 'cc');
INSERT INTO `duplicaterow` VALUES ('7', 'c', 'cc');
INSERT INTO `duplicaterow` VALUES ('8', 'c', 'xx');
INSERT INTO `duplicaterow` VALUES ('9', 'd', 'dd');

SELECT * from duplicaterow;

(一)单列重复

1、查询单列name重复记录:

SELECT * FROM duplicaterow WHERE name in
(SELECT name from duplicaterow GROUP BY name HAVING count(name) > 1)

2、删除单列name有重复的记录:

DELETE FROM duplicaterow WHERE name in
(SELECT name from duplicaterow GROUP BY name HAVING count(name) > 1);

(MySQL不支持,报了1093的错)

可以通过建临时表来实现

create table tmp 
SELECT name as col1 from duplicaterow GROUP BY name HAVING count(name) > 1;

DELETE from duplicaterow where name in (SELECT col1 from tmp);

drop table tmp;
 
 

执行后的结果:

3、删除单列name有重复,且保留一条:

create table tmp  
SELECT name as col1 from duplicaterow GROUP BY name HAVING count(name) > 1;

create table tmp2 
SELECT min(id) as col1 from duplicaterow GROUP BY name HAVING count(name) > 1; 

DELETE from duplicaterow where name in 
(SELECT col1 from tmp) and id not in (SELECT col1 from tmp2);

drop table tmp;
drop table tmp2;


执行后的结果:

(二)多列重复

1、查询表中name和value重复的记录:

SELECT * from duplicaterow WHERE (name,value) in 
(select name, value from duplicaterow GROUP BY name,value having count(*)>1);
执行后的结果:

2、删除表中name和value重复的记录:

create table tmp 
select name as col1, value as col2 from duplicaterow GROUP BY name, value HAVING count(*)>1; 
DELETE from duplicaterow WHERE (name,value) in (select col1, col2 from tmp);
drop table tmp;
执行后的结果:

3、删除表中name和value重复的,且保留一条:

create table tmp1 
SELECT name as col1,value as col2 from duplicaterow GROUP BY name,value HAVING count(*)>1;

create table tmp2
select min(id) as col1 from duplicaterow GROUP BY name,value HAVING count(*)>1;

delete from duplicaterow where (name, value) in 
(select col1,col2 from tmp1) and id not in 
(select col1 from tmp2);

drop table tmp1;
drop table tmp2;
执行后的结果:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值