SQL Server 2014中使用3表JOIN执行DELETE时全表删除原因求解
问题原因
你的DELETE语句之所以会清空全表,核心原因是要删除的Cars表没有和你筛选未使用车辆的子查询结果建立关联条件:
- 你写的SELECT语句是查询
t1和t2两个子查询关联后的结果,返回的确实是符合「未关联配件、未关联人员」要求的车辆记录 - 但改写为DELETE时,你直接写了
DELETE Cars,后续FROM子句里的t1、t2过滤逻辑没有和要删除的Cars表做绑定,SQL Server识别不到对Cars表的过滤条件,就会直接清空整张Cars表。
另外你代码里存在笔误:关联表实际名称是CarToPersonMap,你写的PersonToCarMap是错误表名,需要修正。
推荐正确写法
用NOT EXISTS逻辑实现需求更简洁直观,也不容易出现关联错误:
DELETE c FROM Cars c WHERE -- 未关联任何配件 NOT EXISTS (SELECT 1 FROM CarToGadgetMap WHERE CarID = c.ID) -- 同时未关联任何人员 AND NOT EXISTS (SELECT 1 FROM CarToPersonMap WHERE CarID = c.ID)
如果要基于你原来的子查询逻辑修改,只需要补上Cars表和筛选结果的关联即可:
DELETE Cars FROM Cars -- 关联你筛选出来的未使用车辆ID INNER JOIN ( SELECT t1.ID FROM (SELECT Cars.ID FROM Cars LEFT JOIN CarToGadgetMap ON Cars.ID = CarToGadgetMap.CarID WHERE CarToGadgetMap.CarID IS NULL) t1 JOIN (SELECT Cars.ID FROM Cars LEFT JOIN CarToPersonMap ON Cars.ID = CarToPersonMap.CarID WHERE CarToPersonMap.CarID IS NULL) t2 ON t1.ID = t2.ID ) unused_cars ON Cars.ID = unused_cars.ID
内容的提问来源于stack exchange,提问作者mikec
相关产品推荐
相关产品推荐

