Oracle SQL跨库更新报错求助:基于其他库空值条件更新表
问题解决:基于DB2表空值更新Oracle表be_einheit
错误原因分析
第一次尝试错误
创建中间表db2table后,在PL/SQL块的if条件中直接使用db2table.merge_einheit_id属于非法操作。表是多行数据的集合,不能直接通过「表名.列名」的方式判断条件,必须通过查询获取具体行的对应值。
第二次尝试错误
UPDATE语句的WHERE子句中引用了db2table.merge_einheit_id,但未将be_einheit与db2table建立关联关系,Oracle无法确定两个表的行如何匹配,因此报「无效标识符」错误。
正确解决方案
方案一:直接关联远程DB2表更新
无需创建中间表,直接在UPDATE语句中关联DB2远程表,通过EXISTS子句判断空值条件:
UPDATE be_einheit be SET be.CHDATE = SYSDATE WHERE be.merge_einheit_id IS NOT NULL AND EXISTS (SELECT 1 FROM be_container bc WHERE bc.einheit_id = be.id) AND EXISTS ( SELECT 1 FROM DB2.r_be_einheit r WHERE r.id = be.id AND r.merge_einheit_id IS NULL );
方案二:使用中间表并关联更新
如果需要保留中间表,先确保中间表包含关联所需的id字段,再在UPDATE时关联中间表:
- 创建包含关联字段的中间表:
CREATE TABLE db2table AS SELECT r.id, r.merge_einheit_id FROM be_einheit be JOIN DB2.r_be_einheit r ON be.id = r.id;
- 关联中间表执行更新:
UPDATE be_einheit be SET be.CHDATE = SYSDATE WHERE be.merge_einheit_id IS NOT NULL AND EXISTS (SELECT 1 FROM be_container bc WHERE bc.einheit_id = be.id) AND EXISTS ( SELECT 1 FROM db2table dt WHERE dt.id = be.id AND dt.merge_einheit_id IS NULL );
内容的提问来源于stack exchange,提问作者Maurice Mertes
相关产品推荐
相关产品推荐

