Oracle中只更新兩張表對應資料的方法

2021-06-02 16:07:48 字數 1500 閱讀 1914

先建立乙個結構一模一樣的表emp1,並為其插入部分資料

create table emp1

asselect * 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還沒有主鍵的緣故(子查詢的結果中,更新資料來源(test2)的內容不唯一,導致被更新物件(test1)中的一行可能對應資料來源(test2)中的多行。)

下面增加乙個主鍵

alter table emp1

add constraint pk_emp1 primary key (empno);

執行之後

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

這裡我們總結一下:

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

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

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

oracle中兩張表資料比較

資料庫 oracle 在某些情況下,我們會需要比較兩張表的資料是否一樣。假設有兩張表a與表b他的字段相同,但是當中的資料可能不同,而且有些欄位的資料還有可能為空 方法一 手動 把需要比較的兩張表的資料按照某種規則排序後匯出為xls,這裡我直接用pl sql developer匯出 然後用把xls檔案...

oracle兩張表的資料比較

資料庫 oracle 在某些情況下,我們會需要比較兩張表的資料是否一樣。假設有兩張表a與表b他的字段相同,但是當中的資料可能不同,而且有些欄位的資料還有可能為空 方法一 手動 把需要比較的兩張表的資料按照某種規則排序後匯出為xls,這裡我直接用pl sql developer匯出 然後用把xls檔案...

oracle兩張表的資料比較

align left align 在某些情況下,我們會需要比較兩張表的資料是否一樣。假設有兩張表a與表b他的字段相同,但是當中的資料可能不同,而且有些欄位的資料還有可能為空 方法一 手動 把需要比較的兩張表的資料按照某種規則排序後匯出為xls,這裡我直接用pl sql developer匯出 然後用...