为了账号安全,请及时绑定邮箱和手机立即绑定

SQL NOT IN NULL 问题

标签:
Oracle

最近工作的时候遇到一个查询问题,SQL如下:
select indicator.*FROM t_ind_indicator_info indicator WHERE indicator.STATUS = 1 AND indicator.FLAG = 1 AND indicator.MGRIND_TYPE = 1 AND indicator.id not in (select distinct t.indicator_id from t_ind_riskwarning_indicator t)

突然查询的时候为空了,然后查看数据库发现 indicator_id 有个为NULL 。

原来是在not in 的时候 NULL 会影响结果集为空的。

select from tableA where tableA.in not in (A,NULL) 相当于select from tableA where tableA.id <> A and tableA.id <> NULL 。 而在ANSI SQL中 <>null 返回的结果永远是0,即没有结果集,且不会提示语法错误。当一个有结果集的数据and一个无结果集的数据,最终结果为无结果集。

select from tableA where tableA.in in (A,NULL) 相当于select from tableA where tableA.id = A or tableA.id = NULL 。 而在ANSI SQL中 =null 返回的结果永远是0,即没有结果集,且不会提示语法错误。当一个有结果集的数据or一个无结果集的数据,最终结果为有结果集的数据。

因此not in 使用的时候一定要避免NULL的出现,最简单的可以使用

select * from A where A.id not in (select id from B where b.id IS NOT NULL)

not in 类似其它方法 join 和not exists。

not exists 方式

select indicator.*
   FROM t_ind_indicator_info indicator
WHERE indicator.STATUS = 1
   AND indicator.FLAG = 1
   AND indicator.MGRIND_TYPE = 1
   and   not exists
       (select 1 from t_ind_riskwarning_indicator t where t.indicator_id = indicator.id)

join 方式

 FROM t_ind_indicator_info indicator  left  join t_ind_achievement_indicator t on t.indicator_id = indicator.id
  where t.id is  null 
   and indicator.STATUS = 1
   AND indicator.FLAG = 1
   AND indicator.MGRIND_TYPE = 1  

--注:本人水平有限,如有问题或错误欢迎指正。--

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
5
获赞与收藏
17

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消