You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:34:54