sql語句刪除表中重複的數據

mysql> select * from user;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | 張三   |  11 |
|  2 | 張三   |  11 |
|  3 | 李四   |  11 |
+----+--------+-----+
3 rows in set (0.00 sec)

不想看文章的朋友,直接拿去

mysql> delete from user
    -> where id not in
    -> (select * from
    -> (select min(id) from user group by name,age)as a);

試驗過程:
預期sql語句

利用group by對同一數據進行分組,利用min(id)的方法找到同一數據的最小id(當然,你想最大也可以,max(id))

select min(id) from user group by name,age;

最後利用not in找到屬於重複數據的id,接着刪除

mysql> delete from user
    -> where id not in
    -> (select min(id) from user group by name,age);
ERROR 1093 (HY000): You can't specify target table 'user' for update in FROM clause

ERROR 1093 (HY000): You can’t specify target table ‘user’ for update in FROM clause
要求不能對進行查詢操作的表進行update操作,也就說我們的where條件中進行了子查詢,並且子查詢也是針對需要進行update操作的表的,mysql不支持這種查詢修改的方式。
經過查詢資料,發現可以使用臨時表來保存數據以此來規避錯誤

mysql> delete from user
    -> where id not in
    -> (select * from
    -> (select min(id) from user group by name,age));
ERROR 1248 (42000): Every derived table must have its own alias

ERROR 1248 (42000): Every derived table must have its own alias
要求每一個派生出來的表都必須有一個自己的別名
參考如下:

Every derived table must have its own alias(sql語句錯誤解決方法) - KING - CSDN博客
https://blog.csdn.net/qq_32863631/article/details/83024322

簡而言之,就是在查詢表的後面添加as 別名就可以了
改變一下sql語句
(a表示的是select min(id) from user group by name,age執行後的臨時表)

(select * from
    -> (select min(id) from user group by name,age)as a);

所以,最後的sql語句就完成了

mysql> delete from user
    -> where id not in
    -> (select * from
    -> (select min(id) from user group by name,age)as a);
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | 張三   |  11 |
|  3 | 李四   |  11 |
+----+--------+-----+
2 rows in set (0.00 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章