表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的限制。