Delete语句可正常运行但未删除行,请求排查原因
问题诊断
嘿,我一眼就揪出问题根源了——你在IN子句里的列顺序完全搞反了!
你写的DELETE语句里,是用(client_id, art_no)去匹配子查询的结果,但子查询返回的是(art_no, client_id)。数据库会按顺序逐一匹配:拿article.client_id和子查询的第一个列art_no对比,拿article.art_no和子查询的第二个列client_id对比,这显然不可能找到匹配的行,自然就没有数据被删除了。
另外还要提一句:你子查询里的a.cliend_id是拼写错误,应该是A.client_id——虽然你说子查询返回结果正确,但这个笔误可能在某些数据库里会报错,建议一起修正。
修正后的SQL语句
把子查询的列顺序调整成和主表匹配的(client_id, art_no),同时修正拼写错误:
DELETE FROM article WHERE (client_id, art_no) IN ( SELECT D.client_id, A.art_no FROM art_del AS A INNER JOIN (SELECT DISTINCT client_id FROM article) AS D ON A.client_id = D.client_id WHERE label NOT IN (0, -1) );
额外建议
- 预览待删除行:执行DELETE前,先把语句改成
SELECT * FROM article WHERE ...,预览一下要删除的记录,确保逻辑正确,避免误删数据。 - 验证子查询结果:单独运行子查询
SELECT D.client_id, A.art_no FROM ...,确认返回的列顺序和主表的(client_id, art_no)完全一致,且确实存在和主表匹配的记录。
内容的提问来源于stack exchange,提问作者ferye21
相关产品推荐
相关产品推荐

