Oracle中的 UPDATE FROM 解決方法

2021-06-21 07:52:57 字數 1612 閱讀 8700

在表的更新操作中,在很多情況下需要在表示式中引用要更新的表以外的資料。象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只涉及乙個表且檢視列中包含了被更新的表的整個主鍵,否則不能更新檢視的基表。

實際參考語句:

update goods g set tariff = 

( select "g_code_ts" from  "temp" t where  "mergerid" =g.gmodel )

where g.tariff = 'gmodel' 

oracle中的角色

oracle 中的角色 一 何為角色?我在前面的篇幅中說明許可權和使用者。慢慢的在使用中你會發現乙個問題 如果有一組人,他們的所需的許可權是一樣的,當對他們的許可權進行管理的時候會很不方便。因為你要對這組中的每個使用者的許可權都進行管理。有乙個很好的解決辦法就 是 角色。角色是一組許可權的集合,將角...

Oracle中的約束

資料的完整性用於確保資料庫資料遵從一定的商業和邏輯規則,在oracle中,資料完整性可以使用約束 觸發器 應用程式 過程 函式 三種方法來實現,在這三種方法中,因為約束易於維護,並且具有最好的效能,所以作為維護資料完整性的首選。1.約束 約束用於確保資料庫資料滿足特定的商業規則。在oracle中,約...

oracle中的序列

oracle中的序列 sequence 的作用相當與sqlserver中的identify作為乙個表的自動增加且唯一標識的列 下面我就用乙個簡單的序列來實現 1.建立序列 create sequence sq sq宣告乙個序列的名稱 start with 1 宣告序列的開始值 immediate b...