在表的更新操作中,在很多情況下需要在表示式中引用要更新的表以外的資料。象sql server提供了update的from 子句,可以將要更新的表與其它的資料來源連線起來。雖然只能對乙個表進行更新,但是通過將要更新的表與其它的資料來源連線起來,就可以在update的表示式中引用要更新的表以外的其它資料。
例如:update table2
set table2.colb = table2.colb + table1.colb
from table2
inner join table1
on (table2.cola = table1.cola);
實際更新的操作是在要更新的表上進行的,而不是在from子句所形成的新的結果集上進行的。
oracle沒有update from語法,可以通過兩種寫法實現同樣的功能:
1:子查詢update a set a.name=(select b.name from b where b.id=a.id),本查詢要根據具體情況看看是否變通成如下
(1)單列
update a
set a.name=(select b.name from b where b.id=a.id)
where a.id in (select id from b);
(2)多列
update order_rollup
set(qty,price)=(select sum(qty),sum(price) from order_lines where customer_id='kohl' )
where cust_id='kohl' and order_period=to_date('01-oct-2000')
2:利用檢視來做
update (select a.name aname,b.name bname from a,b where a.id=b.id)
set aname=bname;
例如:update tablea a
set a.fieldforupdate = (select b.fieldsource from tableb b where a.keyfield = b.keyfield)
where exists (select b.fieldsource from tableb b where a.keyfield = b.keyfield)
有三點需要注意:
1. 對於乙個給定的a.keyfield的值,select b.fieldsource from tableb b where a.keyfield = b.keyfield 的值只能是乙個唯一值,不能是多值。
2. 在絕大多數情況下,最後面的where exists子句是重要的,否則將得到錯誤的結果。
3. 對於檢視更新的限制:
如果檢視基於多個表的連線,那麼使用者更新(update)檢視記錄的能力將受到限制。除非update只涉及乙個表且檢視列中包含了被更新的表的整個主鍵,否則不能更新檢視的基表。
補充:delete from 多表關聯列子
delete from t2
where exists(select 1 from t1 where t1.num = t2.num and t1.num = '123456');
oracle中的角色
oracle 中的角色 一 何為角色?我在前面的篇幅中說明許可權和使用者。慢慢的在使用中你會發現乙個問題 如果有一組人,他們的所需的許可權是一樣的,當對他們的許可權進行管理的時候會很不方便。因為你要對這組中的每個使用者的許可權都進行管理。有乙個很好的解決辦法就 是 角色。角色是一組許可權的集合,將角...
Oracle中的約束
資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則,在oracle中,資料完整性可以使用約束 觸發器 應用程式 過程 函式 三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。1.約束 約束用於確保資料庫資料滿足特定的商業規則。在oracle中,約...
oracle中的序列
oracle中的序列 sequence 的作用相當與sqlserver中的identify作為乙個表的自動增加且唯一標識的列 下面我就用乙個簡單的序列來實現 1.建立序列 create sequence sq sq宣告乙個序列的名稱 start with 1 宣告序列的開始值 immediate b...