MySQL 中 delete where in 语句的子查询限制

本文详细解析了在MySQL中使用子查询进行数据删除时遇到的语法错误,特别是当目标表出现在FROM子句中时的限制。通过调整查询结构,即将子查询结果集重命名为临时表,成功绕过了这一限制,实现了预期的数据删除操作。

根据ID删除数据,代码如下:

DELETE
FROM
	t_swcas_db_sync_send_task
WHERE
	id IN (
		SELECT
			b.id AS id
		FROM
			t_swcas_db_old_part_back a
		INNER JOIN t_swcas_db_sync_send_task b ON a.ID = b.REF_ID
		WHERE
			WARRANTY_PARTS_STATUS = '已收货'
	)

执行异常信息

[Err] 1093 - You can’t specify target table ‘t_swcas_db_sync_send_task’ for update in FROM clause

#SQL调整

DELETE
FROM
	t_swcas_db_sync_send_task
WHERE
	id IN (
		SELECT
			id
		FROM
			(
				SELECT
					b.id AS id
				FROM
					t_swcas_db_old_part_back a
				INNER JOIN t_swcas_db_sync_send_task b ON a.ID = b.REF_ID
				WHERE
					WARRANTY_PARTS_STATUS = '已收货'
			) AS n
	)

执行成功

原因分析

in 条件里的查询结果需要 重命名才能语法通过。

再试一下查询

select * 
FROM
	t_swcas_db_sync_send_task
WHERE
	id IN (

				SELECT
					b.id AS id
				FROM
					t_swcas_db_old_part_back a
				INNER JOIN t_swcas_db_sync_send_task b ON a.ID = b.REF_ID
				WHERE
					WARRANTY_PARTS_STATUS = '已收货'
	)

没问题,不知道删除为什么要限制,查询不限制。。不纠结,记录下这个坑。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值