sql 刪除重複資料 保留乙個

2021-07-11 00:12:26 字數 2206 閱讀 3746

方法1:

1、建立乙個臨時表,選取需要的資料。

2、清空原表。

3、臨時表資料匯入到原表。

4、刪除臨時表。

mysql> select * from student;

+----+------+

| id | name |

+----+------+

| 11 | aa |

| 12 | aa |

| 13 | bb |

| 14 | bb |

| 15 | bb |

| 16 | cc |

+----+------+

6 rows in set

mysql> create temporary table temp as select min(id),name from student group by name;

query ok, 3 rows affected

records: 3 duplicates: 0 warnings: 0

mysql> truncate table student;

query ok, 0 rows affected

mysql> insert into student select * from temp;

query ok, 3 rows affected

records: 3 duplicates: 0 warnings: 0

mysql> select * from student;

+----+------+

| id | name |

+----+------+

| 11 | aa |

| 13 | bb |

| 16 | cc |

+----+------+

3 rows in set

mysql> drop temporary table temp;

query ok, 0 rows affected

這個方法,顯然存在效率問題。

方法2:按name分組,把最小的id儲存到臨時表,刪除id不在最小id集合的記錄,如下:

mysql> create temporary table temp as select min(id) as minid from student group by name;

query ok, 3 rows affected

records: 3 duplicates: 0 warnings: 0

mysql> delete from student where id not in (select minid from temp);

query ok, 3 rows affected

mysql> select * from student;

+----+------+

| id | name |

+----+------+

| 11 | aa |

| 13 | bb |

| 16 | cc |

+----+------+

3 rows in set 

方法3:直接在原表上操作,容易想到的sql語句如下:

mysql> delete from student where id not in (select min(id) from student group by name);

執行報錯:1093 - you can't specify target table 'student' for update in from clause

原因是:更新資料時使用了查詢,而查詢的資料又做了更新的條件,mysql不支援這種方式。

怎麼規避這個問題?

再加一層封裝,如下:

mysql> delete from student where id not in (select minid from (select min(id) as minid from student group by name) b);

query ok, 3 rows affected

mysql> select * from student;

+----+------+

| id | name |

+----+------+

| 11 | aa |

| 13 | bb |

| 16 | cc |

+----+------+

3 rows in set

SQL 刪除重複資料,只保留1條

if not object id tempdb.t is null drop table t gocreate table t id int,name nvarchar 1 memo nvarchar 2 insert t select 1,n a n a1 union all select 2,n...

SQL刪除重複資料,並保留GUID最小的一條資料

操作步驟 1 首先,查詢表中每乙個重複資料的最小guid的一條資料,重覆記錄是根據單個字段 repeat 來判斷 select from table t where t.guid select min a.guid from table a where a.repeat t.repeat 2 查出除...

sql刪除重複資料

1 建立表 create table dbo test id numeric 18,0 identity 1,1 not null primary key,name varchar 200 collate chinese prc ci as null remark varchar 1024 coll...