Oracle允許您更新SELECT語句的結果。更新SELECT語句的結果
UPDATE (<SELECT Statement>)
SET <column_name> = <value>
WHERE <column_name> <condition> <value>;
我想這可以用於基於另一個表中匹配行的值更新一個表中的列。
該功能是如何調用的,它可以有效地用於大型更新,當SELECT連接多個表時它是否工作,如果是這樣,如何工作?
Oracle允許您更新SELECT語句的結果。更新SELECT語句的結果
UPDATE (<SELECT Statement>)
SET <column_name> = <value>
WHERE <column_name> <condition> <value>;
我想這可以用於基於另一個表中匹配行的值更新一個表中的列。
該功能是如何調用的,它可以有效地用於大型更新,當SELECT連接多個表時它是否工作,如果是這樣,如何工作?
感謝的意見,我認爲這是標準的SQL ... :(
對於Oracle,你可以在桌子上寫的更新,你用檢索信息加入這樣的:
UPDATE (
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t2.t1id = t1.ID
) SET t1.col1 = t2.col2
對於SQL Server中,它是:
UPDATE t1
SET col1 = t2.col2
FROM table1 t1
LEFT JOIN table2 t2 on t2.t1id = t1.id
如果有人知道的方式來做到這一點在Oracle,SQL Server和MySQL的作品我有興趣
。您提到的表單沒有具體的名稱AFAIK。只需更新select語句的結果即可。
有一個稱爲相關更新(與單或多列更新)另一種形式
UPDATE TABLE(<SELECT STATEMENT>) <alias>
SET <column_name> = (
SELECT <column_name>
FROM <table_name> <alias>
WHERE <alias.table_name> <condition> <alias.table_name>
);
的多列形式
...
SET (<column_name_list>) = (
SELECT <column_name_list>
...
還有一個從它也返回值的稱爲更新帶退貨條款
還有一些具體的s用嵌套表進行更新。最好是檢查
我還沒有爲這個看到一個正式的名字,至少這兩個頁面。 Oracle SQL Reference只是指更新子查詢。我傾向於將其視爲「視圖更新」的一種形式,子查詢處於內聯視圖。
是的,它適用於多個表加入時,但受到視圖更新規則的約束。這意味着只能更新視圖基表中的一個,並且該表必須在視圖中保留爲「鍵保留」狀態:即其行必須只能在視圖中出現一次。這要求視圖(子查詢)中的任何其他表都通過要更新的表上的外鍵約束來引用。
一些示例可能有所幫助。使用標準Oracle EMP和DEPT表,並將EMP.EMPNO定義爲EMP的主鍵,並將EMP.DEPTNO定義爲DEPT的外鍵。DEPTNO,那麼這個更新是允許的:
update (select emp.empno, emp.ename, emp.sal, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set sal = sal+100;
但是,這並不:
-- DEPT is not "key-preserved" - same DEPT row may appear
-- several times in view
update (select emp.ename, emp.sal, dept.deptno, dept.dname
from emp join dept on dept.deptno = emp.deptno
)
set dname = upper(dname);
至於性能:優化器會(必須)確定基本表分析過程中進行更新,並加入到其他表將被忽略,因爲他們沒有上進行更新任何影響 - 因爲這AUTOTRACE輸出顯示:
SQL> update (select emp.ename, emp.sal, dept.dname
2 from emp join dept on dept.deptno = emp.deptno
3 )
4 set sal = sal-1;
33 rows updated.
Execution Plan
----------------------------------------------------------
Plan hash value: 1507993178
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 33 | 495 | 3 (0)| 00:00:01 |
| 1 | UPDATE | EMP | | | | |
| 2 | NESTED LOOPS | | 33 | 495 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 33 | 396 | 3 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN| SYS_C0010666 | 1 | 3 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
(請注意,表DEPT從未訪問即使DEPT.DNAME APPE子查詢中的ars)。
有一個例子在另一個連接更新的例子:http://stackoverflow.com/questions/975315/what-is-wrong-with-my-update-statement-with-a-join-in- oracle/975674#975674 - 關於效率:它可能是更新一組行的最有效方式 – 2009-06-16 09:21:51
它通常稱爲視圖更新。 – 2009-06-16 09:56:13