oracle update from

很多熟悉SQL server的朋友在接觸到oracle的時候經常犯的一個錯誤就是總以爲oracle中也會有update from這種結構。請你死了這條心吧,在oracle中的update語句中不存在from語句。

前面我們簡單介紹過Oracle的update語句。這裏我們重點介紹如果基於別的表來更新當前表的update語法。

我們知道在oracle中的例子數據庫中有名爲scott的schema,裏面有一個表是emp,我們就拿這裏表來舉例

先建立一個結構一模一樣的表emp1,併爲其插入部分數據

create table emp1
as
select * from emp where deptno = 20;

update掉emp1中的部分數據
update emp1
set sal = sal + 100,
comm = nvl(comm,0) + 50

然後我們試着使用emp1中數據來更新emp中sal 和 comm這兩列數據。

我們可以這麼寫
Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)

請你尤其注意這裏的where子句,你可以嘗試不寫where子句來執行以下這句話,你將會使得emp中的很多值變成空。

這是因爲在oracle的update語句中如果不寫where子句,oracle將會默認的把所有的值全部更新,即使你這裏使用了子查詢並且某在值並不能在子查詢裏找到,你就會想當然的以爲,oracle或許將會跳過這些值吧,你錯了,oracle將會把該行的值更新爲空。

我們還還可以這麼寫:

update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
set asal = bsal,
acomm = bcomm;

這裏的表是一個類視圖。
當然你執行時可能會遇到如下錯誤:

ERROR 位於第 2 行:
ORA-01779: 無法修改與非鍵值保存表對應的列
這是因爲新建的表emp1還沒有主鍵的緣故

下面增加一個主鍵
alter table emp1
add constraint pk_emp1 primary key (empno);

執行之後

在執行前面的語句就能成功。

這裏我們總結一下:

在oracle中不存在update from結構,所以遇到需要從另外一個表來更新本表的值的問題的時候,有兩種解決的辦法:

一種是使用子查詢,使用子查詢時一定要注意where條件(一般後面接exists子句),除非兩個表是一一對應的,否則where條件必不可少,遺漏掉where條件時可能會導致插入大量空值。

另外一種是類視圖的更新方法,這也是oracle所獨有的。先把對應的數據全部抽取出來,然後更新表一樣更新數據,這裏需要注意的是,必須保證表的數據唯一型。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章