oracle中要謹慎使用update交叉更新!

warehouse發表於2008-12-09
在oracle中使用update進行交叉更新時一直都覺得很不方便,當然這是和sql server or sybase相比較而言的。[@more@]

SQL> select *from a1;

ID N SFZHAO
---------- - ------------------
1 a
1 c
2 a
2 c
3 c 123

SQL> select *from a2;

ID N SFZHAO
---------- - ------------------
1 c 111
2 d 111

--如果使用下面的sql來更新表a1的話,我們發現出現了我們不希望出現的結果,把a1中id=3所對應的sfzhao由原來的123更新成了null,這是我們不希望的。

SQL> update a1 set sfzhao=(select a2.sfzhao from a2 where a2.id=a1.id and a2.nam
e=a1.name);

已更新5行。

SQL> select *from a1;

ID N SFZHAO
---------- - ------------------
1 a
1 c 111
2 a
2 c
3 c

SQL> rollback;

回退已完成。

--為了糾正上面update所產生的錯誤結果,在where字句中做了進一步的限定。

SQL> update a1 set sfzhao=(select a2.sfzhao from a2 where a2.id=a1.id and a2.nam
e=a1.name) where (id , name) in (select id , name from a2 where a2.id=a1.id and
a2.name=a1.name);

已更新 1 行。

SQL> select *from a1;

ID N SFZHAO
---------- - ------------------
1 a
1 c 111
2 a
2 c
3 c 123

SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1014388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章