先建立乙個結構一模一樣的表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匯出 然後用...