今天又碰到了這個問題,在oracle中沒有update from這樣的語法,但可以實現同樣的功能。
表的更新操作中,在很多情況下需要在表示式中引用要更新的表以外的資料。象sql server提供了update的from 子句,可以將要更新的表與其它的資料來源連線起來。雖然只能對乙個表進行更新,但是通過將要更新的表與其它的資料來源連線起來,就可以在update的表示式中引用要更新的表以外的其它資料。
例如:
update
dbo.table2
setdbo.table2.colb
=dbo.table2.colb
+dbo.table1.colb
from
dbo.table2
inner
join
dbo.table1
on(dbo.table2.cola
=dbo.table1.cola);
實際更新的操作是在要更新的表上進行的,而不是在from子句所形成的新的結果集上進行的。
oracle沒有update from語法,可以通過兩種寫法實現同樣的功能:
1:子查詢update a set a.name=(select b.name from b where b.id=a.id),本查詢要根據具體情況看看是否變通成如下
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
(select
a.name aname,b.name bname
from
a,b
where
a.id
=b.id)
setaname
=bname;
例如:
update
tablea a
seta.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只涉及乙個表且檢視列中包含了被更新的表的整個主鍵,否則不能更新檢視的基表。
oracle中的角色
oracle 中的角色 一 何為角色?我在前面的篇幅中說明許可權和使用者。慢慢的在使用中你會發現乙個問題 如果有一組人,他們的所需的許可權是一樣的,當對他們的許可權進行管理的時候會很不方便。因為你要對這組中的每個使用者的許可權都進行管理。有乙個很好的解決辦法就 是 角色。角色是一組許可權的集合,將角...
Oracle中的約束
資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則,在oracle中,資料完整性可以使用約束 觸發器 應用程式 過程 函式 三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。1.約束 約束用於確保資料庫資料滿足特定的商業規則。在oracle中,約...
oracle中的序列
oracle中的序列 sequence 的作用相當與sqlserver中的identify作為乙個表的自動增加且唯一標識的列 下面我就用乙個簡單的序列來實現 1.建立序列 create sequence sq sq宣告乙個序列的名稱 start with 1 宣告序列的開始值 immediate b...