参考网页
SQL删除重复数据只保留一条
MYSQL之You can't specify target table for update in FROM clause解决办法
问题
项目任务表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
)