MySQL中刪除重複數據

參考網頁

SQL刪除重複數據只保留一條mysql

https://blog.csdn.net/anya/article/details/6407280sql

MYSQL之You can't specify target table for update in FROM clause解決辦法oracle

https://blog.csdn.net/z_youarethebest/article/details/53785487spa

問題

項目任務表task表中有重複數據,是操做人員重複點擊(且後臺邏輯沒有作校驗)形成。.net

task記錄是根據dispatch表生成的,重複的task記錄指的就是存在多條dispatch_id相同的數據。blog

要求:刪除重複的task記錄,只保留task_id最小的一條

篩選出要刪除的數據

SELECTci

*get

FROMtable

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

)

相關文章
相關標籤/搜索