去重时遇到invalid number错误——表自连接时是先从外面过滤,还是先执行where条件

来源:互联网 发布:app软件怎么开发 编辑:程序博客网 时间:2024/06/08 00:46

表A里面有电话和宽带产品信息,对于同一个地址存在多个电话或多个宽带的可能(已经处理了同一地址既存在电话又存在宽带情况),现在要处理多个电话情况,只保留电话号码最小那个。由于电话的接入号就是电话号码本身,宽带的接入号则是以ADSL开头的字符串,所以采取下面的方法删除多个电话的:

  delete from A ss
   where ss.prod_id = 1   --电话产品
     and to_number(ss.acc_nbr) > (select min(to_number(ss2.acc_nbr))
                                                         from A ss2
                                                       where ss2.stid=ss.stid);

 

原以为可以顺利删掉的,但却遇到了ORA-01722:invalid number的错误。

仔细考虑后认为是以下原因:

刚开始以为在外面限制prod_id=1后,后面括号里ss的stid就只会是有电话的地址,但实际情况却是取ss的所有stid,执行完where条件后再去外面过滤,所以会遇到宽带的接入号而无法转换为number类型。解决的办法是where条件后括号里也给ss2加上prod_id的限制。