MySQL中删除重复数据
2019獨角獸企業重金招聘Python工程師標準>>>
參考網頁
SQL刪除重復數據只保留一條
https://blog.csdn.net/anya/article/details/6407280
MYSQL之You can't specify target table for update in FROM clause解決辦法
https://blog.csdn.net/z_youarethebest/article/details/53785487
問題
項目任務表task表中有重復數據,是操作人員重復點擊(且后臺邏輯沒有做校驗)造成。
task記錄是根據dispatch表生成的,重復的task記錄指的就是存在多條dispatch_id相同的數據。
要求:刪除重復的task記錄,只保留task_id最小的一條
篩選出要刪除的數據
SELECT
*
FROM
task
WHERE
dispatch_id IN (
SELECT
dispatch_id
FROM
task
GROUP BY
dispatch_id
HAVING
COUNT(*) > 1
)
AND task_id NOT IN (
SELECT
MIN(task_id)
FROM
task
GROUP BY
dispatch_id
HAVING
COUNT(*) > 1
)
刪除數據,結果報錯:You can't specify target table 'task' for update in FROM clause
不能先select出同一表中的某些值,再update這個表(在同一語句中)。
將select出的結果再通過中間表select一遍,這樣就規避了錯誤。注意,這個問題只出現于mysql,mssql和oracle不會出現此問題。
最終可以成功執行的sql語句
DELETE
FROM
task
WHERE
task_id IN (
SELECT
task_id
FROM
(
SELECT
task_id
FROM
task
WHERE
dispatch_id IN (
SELECT
dispatch_id
FROM
task
GROUP BY
dispatch_id
HAVING
COUNT(*) > 1
)
AND task_id NOT IN (
SELECT
MIN(task_id)
FROM
task
GROUP BY
dispatch_id
HAVING
COUNT(*) > 1
)
) a
)
?
轉載于:https://my.oschina.net/u/3866531/blog/1862988
總結
以上是生活随笔為你收集整理的MySQL中删除重复数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scala进阶之路-面向对象编程之类的成
- 下一篇: webapi 返回类型