oracle中not in可以这样用不?

ydj552110737 2011-09-09 10:52:11
select * from course where precourseid not in (select precourseid from course where precourseid is not null);
子查询会返回四个id数字值,我想查询precourseid为null的行的所有信息,如果直接查询select * from course where precourseid is null;这样会得到想要的结果,但是如果用子查询那样就会出错,求解答。
...全文
344 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cz_study_java 2011-09-09
  • 打赏
  • 举报
回复
值得学习
magong 2011-09-09
  • 打赏
  • 举报
回复
看看这个,呵呵。

select * from course c1 where not exists (
select precourseid from course c2
where precourseid is not null
and c1.precourseid = c2.precourseid
)
magong 2011-09-09
  • 打赏
  • 举报
回复
哦,原来是个三值运算的问题。
null和任何值比较运算都是false
linhui9010 2011-09-09
  • 打赏
  • 举报
回复
贴出错误提示
magong 2011-09-09
  • 打赏
  • 举报
回复
course表用个别名试试看。
bennyraul 2011-09-09
  • 打赏
  • 举报
回复
null的问题
112 2011-09-09
  • 打赏
  • 举报
回复
还是要好好学习SQL语言本身的特性啊。

答案在这里:

这是你想要查询的数据:select * from course where precourseid is null;

这是你用的另一种方法:select * from course where precourseid not in (select precourseid from course where precourseid is not null);

注意了,在SQL中,where子句中的筛选条件有以下限制:
1.如果条件判断的结果为false或null,那么该条件判断的最终结果为false(假)。
2.如果条件判断的结果为true,那么那么该条件判断的最终结果为true(真)。

你注意你的判断条件not in,由于你找的是precourseid为null的数据。

但是SQL语言规定,null值和任何数据做条件判断,结果都为null,也就是最终判断结果为false(假)。当数据库在判断到precourseid为null的数据时,实际上是在判断null not in (...),结果肯定是null。因此,你的那条子查询语句永远也查不出结果来。

另外,你注意一下is null这种写法,它实际上就是为了解决任何值和null比较都为null这个问题的,如果你用了=null,那么select * from course where precourseid = null也是查不出来数据的。

希望对你有所帮助。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧