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

)

相关文章
相关标签/搜索