Related to Oracle SQL 由Not in 引起取不到数据的错误

    今天一个同事测试的应用出了BUG,原先好好的一个页面竟然读不出数据了。正好昨晚更新了一个版本,这下完了,有可能提交的版本有问题,大冷的天还让人冒出冷汗,问题让人费解,但还是要解决的。找到根源原来是读取数据的SQL语句竟然连一条数据都没SELECT出来,而数据库中明明按那个条件查询都是有数据的,但是SQL语句就是选择不出来。 我注意到这个SQL语句中使用了NOT IN,按理说为了效率一般都是使用exist 或者连接 代替 in操作的,可是既然他使了NOT IN 那就看看问题到底出在哪吧。 语句类似这样

     SELECT ID,B,C FROM TABLE_ONE T WHERE T.ID NOT IN

            (SELECT ID FROM TABLE_TWO T2 WHERE T2.ONE_COLUMN = '123456')

上边语句中两个表的ID字段都是用序列生成的唯一值,按理说都是不为空的。可能由于种种原因,数据库中TABLE_TWO表中的ID字段竟然存在了空值,而SELECT ID FROM TABLE_TWO T2 WHERE T2.ONE_COLUMN = '123456' 这个子查询取得的ID正好是空值,这样问题就出现了像SELECT * FROM TABLE T WHERE T.COLUMN NOT IN '' 这个语句是什么值都取不到的 ,因为NOT IN 后边接了一个空值。正是因为开发时认定了这个字段不会存在空值所以才暴露了这样潜在的问题,写好SQL语句真的是很重要啊,这个语句好像是一颗定时炸弹。。吸取教训,nothing is impossible 啊。

你可能感兴趣的:(Related,to,Oracle,SQL,sql,oracle,table,数据库,测试)