数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

慎用Oracle的notin


发布日期:2018年06月27日
 
慎用Oracle的notin

帮财务人员处理数据一个是ERP系统中的账面数据一个是税务局给的官方数据一张EXCEL表想找出两边不匹配的数据

据说EXCEL版本已经提供了这种比对的功能但无奈数据量太大操作起来巨慢如牛而WPS似乎还没这个功能于是导入数据库中新建一个表存储这些数据来比对

开始写了个SQL来查询税务有而ERP系统中没有的数据

select * from tab_excel where taxcode not in

(select erpcode from tab_excel)

正常然后反过来查ERP中存在而税务系统中不存在的数据

select * from tab_excel where erpcode not in

(select taxcode from tab_excel)

返回条数据很奇怪然后马上想到了是null的问题taxcode必然存在值为null的记录oracle中和null比较的返回值是unkown所以才无法匹配

于是修改SQL语句如下

select * from tab_excel tout where not exists

(select from tab_excel where taxcode=touterpcode)

结果正常

not in () 括号中的返回值不能存在null值是Oracle SQL开发的一条铁律如果不能确定返回结果一定无null值还是改写为not esists吧而且not in效率低下一般不能用到索引生产环境的程序最好不要使用

上一篇:Oracle三层嵌套查询

下一篇:理解和使用Oracle 8i分析工具-LogMiner