博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL中删除重复数据
阅读量:6066 次
发布时间:2019-06-20

本文共 966 字,大约阅读时间需要 3 分钟。

hot3.png

参考网页

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

)

 

转载于:https://my.oschina.net/u/3866531/blog/1862988

你可能感兴趣的文章
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
七周五次课(1月26日)
查看>>
Linux系统一些系统查看指令
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
根据调试工具看Vue源码之组件通信(一)
查看>>
Thrift RPC 系列教程(5)—— 接口设计篇:struct & enum设计
查看>>
斯坦福-随机图模型-week1.5
查看>>