如何编写SQL脚本删除表M中未在表A、表S存在的客户数据?
删除表M中既不在表A也不在表S的客户数据
要实现删除表M里那些既不存在于表A、也不存在于表S的客户数据,这里提供两种常用的SQL写法,你可以根据使用的数据库选择合适的方式:
方法一:使用NOT EXISTS(推荐,兼容性好且避免NULL问题)
这种方式逻辑直观,而且不会因为A或S表中Customer字段存在NULL值而出错:
DELETE FROM M WHERE NOT EXISTS ( SELECT 1 FROM A WHERE A.Customer = M.Customer ) AND NOT EXISTS ( SELECT 1 FROM S WHERE S.Customer = M.Customer );
逻辑说明:逐个检查M表的每条记录,当这条记录的Customer在A表中找不到匹配,同时在S表中也找不到匹配时,就删除该记录。
方法二:使用NOT IN + UNION
通过UNION合并A和S表的所有客户,再筛选M表中不在这个集合里的记录:
DELETE FROM M WHERE Customer NOT IN ( SELECT Customer FROM A UNION SELECT Customer FROM S );
注意事项:如果A表或S表的Customer字段存在NULL值,NOT IN会导致结果不符合预期(因为NULL与任何值比较的结果都是UNKNOWN),这种情况下建议优先用方法一。
安全提示
执行删除操作前,建议先把DELETE换成SELECT *,验证要删除的记录是否符合预期:
-- 先验证待删除的记录 SELECT * FROM M WHERE NOT EXISTS ( SELECT 1 FROM A WHERE A.Customer = M.Customer ) AND NOT EXISTS ( SELECT 1 FROM S WHERE S.Customer = M.Customer );
内容的提问来源于stack exchange,提问作者BEE
相关产品推荐
相关产品推荐

