Oracle 中用一個表的數據更新另一個表的數據


有下面兩個表:將表tab1中id值與和表tab2中id值相同的行的val更新為tab2中val的值.
select * from tab1;

select * from tab2

 

最容易犯的錯誤是:update tab1 set val=(select val from tab2 where tab1.id=tab2.id);
更新完后的結果是:select * from tab1,在tab1中有的行,如果在tab2中沒有對應的行,值被更新為null

改正為:update tab1 set val=(select val from tab2 where tab1.id=tab2.id)
where exists (select 1 from tab2 where tab1.id=tab2.id)
但是如果tab2中有多條對應tab1中一條的情況也會出錯.
最好的方法是用merge語法:
merge into tab1
using tab2
on(tab1.id=tab2.id)
when matched then
update set tab1.val = tab2.val
同樣,如果tab2中有多條對應tab1中一條的情況也會出錯:ORA-30926: unable to get a stable set of rows in the source tables
比如在tab2中再插入一條 insert into tab2 values(2,'xxxx')
可以通過在using中的subquery中將重復記錄過濾來避免這種錯誤,merge終極版:
merge into tab1
using (select * FROM tab2 X WHERE X.ROWID =
(SELECT MAX(Y.ROWID) FROM tab2 Y WHERE X.ID = Y.ID)) tab2
on(tab1.id=tab2.id)
when matched then
update set tab1.val = tab2.val

————————————————
版權聲明:本文為CSDN博主「IT農夫」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kkdelta/java/article/details/7535027


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM