oracle9i中使用MERGE语法时碰到的问题

最近工作中需要处理一批号码数据.之前项目中有一个号码的黑名单表格字段如下:

black_dn( dn varchar(13),flag number(2))

此表格中保存了一份号码黑名单数据,dn为号码,flag为地市标志.现在又有了一份黑名单.这份黑名单中可能有重复的,可能有之前已经导入到黑名单表格中的.需要把这份黑名单无重复的添加近black_dn表中于是我按照black_dn创建了一个新的表

create balck_dn_new as select * from black_dn where 0=1;

然后将新的数据使用sqlload全部导入到新的表中,接着我需要更新black_dn中的数据,于是使用了如下的SQL

MERGE INTO BLAKC_DN B1
USING BLACK_DN_NEW B2
ON (B1.DN=B2.DN AND B1.FLAG=B2.FLAG)
WHEN MATCHED THEN
UPDATE SET
B1.DN=B2.DN
B1.FLAG=B2.FLAG
WHEN NOT MATCHED THEN
INSERT VALUES(B2.DN,B2.FLAG);

但是数据库反馈了ORA-00904: "B1"."DN": 无效的标识符,刚开始非常想不通为什么会提示这个错误.明明字段是没有错误的.于是乎有是找了一通资料,发现了问题所在,如果你在on后引用了哪些列,这些列是不允许更新的.但是oracle这个提示错误个人觉得是很有问题的.于是为了正确使用,我又为把balck_dn表扩展为

BLACK_DN (DN VARCHAR(13),FLAG NUMBER(2),IFLAG NUMBER(2))

在IFLAG字段中全部填入了0,然后修改了SQL

MERGE INTO BLAKC_DN B1
USING BLACK_DN_NEW B2
ON (B1.DN=B2.DN AND B1.FLAG=B2.FLAG)
WHEN MATCHED THEN
UPDATE SET
B1.IFLAG=10
WHEN NOT MATCHED THEN
INSERT VALUES(B2.DN,B2.FLAG,1);

本以为万事大吉,结果oracle还是不干,反馈错误

ORA-30926: 无法在源表中获得一组稳定的行

郁闷,这个地方balck_dn_new和black_dn出现了多对一的现象,也是不允许的啊.不过这时本人已铁了新,非要用MERGE语句完成功能,于是对balck_dn进行了排重工作,接着用上面的SQL,OK,现在目的打到了.一个任务完成,虽然费了点时间.不过也算多学习点东西.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值