如何删除CO2_Data表中不在vw_Countries视图内的数据?
解决DELETE语句报错问题
错误原因
你写的not in(vw_Countries)存在语法错误,SQL无法直接将视图名作为集合来源识别,必须明确从视图中查询出country列的数据集。
正确的DELETE语句写法
写法一:使用NOT IN(需确保视图中country列无NULL值)
DELETE FROM [WorldFoodProduction].[dbo].[CO2_Data] WHERE country NOT IN (SELECT country FROM vw_Countries);
写法二:使用NOT EXISTS(推荐,避免NULL值带来的异常)
DELETE FROM [WorldFoodProduction].[dbo].[CO2_Data] cd WHERE NOT EXISTS ( SELECT 1 FROM vw_Countries vw WHERE vw.country = cd.country );
补充说明
- 视图
vw_Countries是通过8张表的INTERSECT生成的,本身存储的是各表共有的country值,用上述语句可以精准删除CO2_Data中不在这个共有集合里的数据。 NOT EXISTS相比NOT IN更安全:如果视图的country列存在NULL值,NOT IN会导致整个条件返回空,最终不会删除任何数据,而NOT EXISTS不受NULL值影响。
内容的提问来源于stack exchange,提问作者solo
相关产品推荐
相关产品推荐

