一、如果兩張表有主鍵關系的話:
執行更新
UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE tt1.ID=tt2.ID) SET col1=cola;
報錯:ORA-01779: 無法修改與非鍵值保存表對應的列
分析
根據錯誤提示:”無法修改與非鍵值保存表對應的列”,初步推斷為tt2中沒有主鍵?
那么在tt2上添加主鍵后再更新試試
ALTER TABLE tt2 ADD CONSTRAINT pk_tt2_id PRIMARY KEY(ID); UPDATE (SELECT tt1.col1 ,tt2.cola,tt1.id,tt2.id FROM tt1,tt2 WHERE tt1.ID=tt2.ID) SET col1=cola;
發現可以成功更新數據。
然后將在tt2上加的主鍵刪除,再在tt1上添加主鍵試試,
ALTER TABLE tt2 DROP CONSTRAINT pk_tt2_id; ALTER TABLE tt1 ADD CONSTRAINT pk_tt1_id PRIMARY KEY(ID);
再執行第3 步中的更新語句,發現還是報錯:ORA-01779: 無法修改與非鍵值保存表對應的列
結論:
用A表去更新B表的數據,A表的關聯條件必須為主鍵,Oracle這樣做的目的是保證表A的滿足關聯條件的數據是唯一的,
這樣在更新B表數據時才有意義(自己都不確定怎么影響別人,是吧,hehe),
當然,如果兩表關聯的字段都為主鍵,則無論誰更新誰都沒有問題。
結論:用A表數據更新B表數據,則A與B的對應關系為:1:1 或 1:n。
二、如果兩站表無任何關系
1.新建臨時表
臨時表數據來源為b表,給a表更新
數據結構有最少有主鍵id,和要更新的列
drop table temp_tt2; create GLOBAL TEMPORARY table tt2( id number(10), col1_b varchar2(10) ) ON COMMIT PRESERVE ROWS;
2.不要忘了設置主鍵
alter table temp_tt2 add constraint pk_id_l primary key (id)
3.從tt2中插入數據到temp_tt2
insert into temp_tt2 select id,col1 from tt2
4.用臨時表和a表關聯進行批量更新
UPDATE (SELECT tt1.col1 ,temp_tt2 .col1_b,tt1.id,temp_tt2 .id FROM tt1,temp_tt2 WHERE tt1.ID=temp_tt2 .ID) SET col1=col1_b;