MySQL中CTE与子查询为何在DELETE操作中表现不同?
为什么CTE写法报错而子查询正常?
语法规则不匹配:MySQL 中
IN操作符的语法要求是后面跟值列表或者括号包裹的子查询。你用 CTE 时直接把临时表名d_goods_ids放在IN后面,不符合语法规范,这才触发了语法错误。而子查询本身就是括号包裹的SELECT语句,刚好满足IN的语法要求,所以能正常执行。CTE 的正确使用方式:CTE 是用来定义临时结果集的,要使用它的数据,必须像操作普通表一样通过
SELECT语句提取列值。你的 CTE 版本需要修改成这样才能正常运行:
WITH d_goods_ids AS (SELECT good_type_id FROM GoodTypes WHERE GoodTypes.good_type_name LIKE "d%") DELETE FROM Goods WHERE type IN (SELECT good_type_id FROM d_goods_ids); SELECT * FROM Goods;
- 本质差异:子查询是直接返回
IN所需的列值集合,而 CTE 是先创建了一个包含目标列的临时表,你必须显式地从这个临时表中选取对应列,才能给IN提供可用的值集合。
内容的提问来源于stack exchange,提问作者Xeem Pad
相关产品推荐
相关产品推荐

