如何删除没有唯一行id存在的重复行?
我的座位是
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
我想留下以下重复删除后:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
我尝试了一些查询,但我认为他们取决于有一个行id,因为我没有得到想要的结果。例如:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
在sql server中可以通过多种方式来实现
最简单的方法是:
将重复行表中的不同行插入到新的临时表中。然后从重复的行表中删除所有数据,然后从没有重复的临时表中插入所有数据,如下所示。
select distinct * into #tmp From table
delete from table
insert into table
select * from #tmp drop table #tmp
select * from table
使用公共表表达式(CTE)删除重复行
With CTE_Duplicates as
(select id,name , row_number()
over(partition by id,name order by id,name ) rownumber from table )
delete from CTE_Duplicates where rownumber!=1
在sql server中可以通过多种方式来实现
最简单的方法是:
将重复行表中的不同行插入到新的临时表中。然后从重复的行表中删除所有数据,然后从没有重复的临时表中插入所有数据,如下所示。
select distinct * into #tmp From table
delete from table
insert into table
select * from #tmp drop table #tmp
select * from table
使用公共表表达式(CTE)删除重复行
With CTE_Duplicates as
(select id,name , row_number()
over(partition by id,name order by id,name ) rownumber from table )
delete from CTE_Duplicates where rownumber!=1
在mysql中有两个解决方案:
A)使用Delete JOIN语句删除重复的行
DELETE t1 FROM contacts t1
INNER JOIN contacts t2
WHERE
t1.id < t2.id AND
t1.email = t2.email;
该查询两次引用联系人表,因此,它使用表别名t1和t2。
输出结果为:
1
查询确定,影响4行(0.10秒)
如果你想删除重复的行并保留最低的id,你可以使用下面的语句:
DELETE c1 FROM contacts c1
INNER JOIN contacts c2
WHERE
c1.id > c2.id AND
c1.email = c2.email;
B)使用中间表删除重复的行
下面是使用中间表删除重复行的步骤:
1。创建一个新表,其结构与要删除重复行的原始表相同。
2。将原始表中的不同行插入到直接表中。
3所示。将原始表中的不同行插入到直接表中。
步骤1。创建一个与原表结构相同的新表:
CREATE TABLE source_copy LIKE source;
步骤2。从原表中插入不同的行到新表中:
INSERT INTO source_copy
SELECT * FROM source
GROUP BY col; -- column that has duplicate values
步骤3。删除原始表并将直接表重命名为原始表
DROP TABLE source;
ALTER TABLE source_copy RENAME TO source;
来源:http://www.mysqltutorial.org/mysql-delete-duplicate-rows/