一个异常的sql问题

今天发现一个很奇怪的sql问题,在一个hp下9205版本的数据库中,执行下面一条语句:

UPDATE A
SET State = '4'
WHERE CNumber IN ( SELECT CNumber
FROM b
WHERE Serial = '20080508000001208868');

这里的b表中只有一条记录,而且A表中的CNumber都是唯一的,可执行这条语句后,发现A表所有数据都被更新了。随后分析一下,先把update改成select,发现确实把A所有数据都取出来了,只好单独执行

SELECT CNumber   FROM b
WHERE Serial = '20080508000001208868'

结果报错ORA-00904: "CNUMBER": invalid identifier

检查发现原来b表的相应字段叫Cnum,而不是CNumber。

我怀疑这是一个bug,显然oracle在做语句分析的时候,并不是先判断子查询是否正确,个人的感觉oracle是直接把条件看作CNumber in CNumber了才产生了这样的问题。

从这个问题的影响来看,危险性是相当大的,整张表都被改了,如果发现不及时恢复都是一件很麻烦的事情。