mysql删除重复sql_mysql中删除完全重复数据的准确SQL语句
刪除數據庫中重復的記錄,只保留一條
DELETE FROM tb_gps_records WHERE id NOT IN (SELECT bid FROM (SELECT min(id) as bid FROM tb_gps_records GROUP BY busNo,longitude,latitude)as b);
//cityId=287
DELETE FROM tb_gps_records WHERE cityId=287 and id NOT IN (SELECT bid FROM (SELECT min(id) as bid FROM tb_gps_records GROUP BY busNo,longitude,latitude)as b);
案例:
id???????? 姓名? 課程名稱 分數
1???????? 張三???? 數學??? 69
2????????? 李四
數學??? 89
3????????? 張三
數學??? 69
刪除除了自動編號不同,其他都相同的學生冗余信息
------------------------------------------------------------------------------------------------------
按常理來說,這個sql語句應該是:
delete tablename where id not in(select min(id) from tablename group by
name,kecheng,fenshu);
這種寫法在sqlserver或者oracle中是支持的,但是mysql目前是不支持的,會報類似錯:You
can't specify target table 'tablename' for update ,這是因為在mysql中不能同時查詢一個表的數據再同時進行刪除.
目前網上流行的一種解法是:
1)創建一個臨時表,講要查詢的列的存入臨時表中
create table temp as select ...
2)在temp表和原始表中進行操作
delete from tablename
3)drop temp...
但是這種做法,不僅浪費空間資源,同時也缺乏友好性。通過觀察我們發現這類查詢要解決的是如何將子查詢中的表與主查詢中的表區分開來,因此我們可以考慮用別名的方法,將子查詢的結果放到一個別名中。
完整的sql語句如下:
DELETE FROM tablename where id not in (select bid
from (select min(id) as bid from tablename group by name,kecheng,fenshu) as b )
;
解釋:
select bid from (select min(id) as bid from tablename group by
name,kecheng,fenshu) as b
這個子查詢的目的是從b中列出講篩選結果,即bid的集合。
(select min(id) as bid from tablename group by name,kecheng,fenshu) as b
將分組結果中的最小的bid當做一個心的集合當做一個心的子表b,
注意mid(id)一定要有一個別名,這里取的是bid,作為b的一個列名,因為在上一級查詢中要用到這個列名(紅色標注)。
總結
以上是生活随笔為你收集整理的mysql删除重复sql_mysql中删除完全重复数据的准确SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 炉石传说砰砰计划——新版蹦蹦兔盗贼卡组
- 下一篇: DIY装机游戏主板哪个牌子好?