UPDATE SET = (SELECT ) 語法的總結
這是3年前的一個總結了,最近發現提交的dba 這邊的這種sql 比較多,
雖然沒有出什麼錯,單還是有必要再拿出來提醒下大家,
update a set a1= (select b1 from b where a2=b2) 這樣的語法還是有很多限制的。
往下接著看吧
alter session set current_schema = netmis_app
upudate nm_hardware b set b.cacti_url = ( select a.CACTI_FLUX_URL from
(select nm_server_info.id AS ID ,nm_server_info.CACTI_FLUX_URL AS CACTO_FLUX_URL
from nm_hardware,nm_server_info
where nm_hardware.id = nm_server_info.id
and nm_server_info.CACTI_FLUX_URL is not null) a where b.id=a.id)
方法一。
-- 用A 表的子段根據條件更新B表的相應資料。
---------------------- 要求 有主鍵做關聯。
更新簡單檢視。 對於大資料量的更新,如果在巢狀查詢中使用 USE_HASN 提示,效率在下列方法中效率最好。
update ( select a.cacti_url ,b.cacti_flux_url from nm_hardware a , nm_server_info b
where a.id= b.id and b.cacti_flux_url is not null ) set cacti_url= cacti_flux_url
-----------------------------
方法二。
update nm_hardware b set b.cacti_url = ( select a.CACTI_FLUX_URL from
nm_server_info a
where b.id = a.id
and a.CACTI_FLUX_URL is not null)
where b.id= ( select id from nm_server_info c where c.id = b.id and c.cacti_flux_url is not null )
------------------------------------------
方法三。
這個方法要求最嚴格, 要求主副表的返回行數要一致,並且關聯欄位要求是主鍵,且一一對應。
否則,會把目標表的其他行更新位NULL , 但是適合條件會更新為正確的值。
update nm_hardware b set b.cacti_url = ( select a.CACTI_FLUX_URL from
nm_server_info a
where b.id = a.id
and a.CACTI_FLUX_URL is not null)
------------------------------------
方法四。 限定返回行。 此方法是方法三的改進,限制返回行。
update nm_hardware b set b.cacti_url = ( select a.CACTI_FLUX_URL from
nm_server_info a
where b.id = a.id
and a.CACTI_FLUX_URL is not null)
where exists ( select id from nm_server_info c where c.id = b.id and c.cacti_flux_url is not null )
------------------------------------------------
方法五。
使用CURSOR 過程逐行更新。
BEGIN
FOR ROW_REC IN (
SELECT A.ID , B.CACTI_FLUX_URL FROM NM_HARDWARE A NM_SERVER_INFO B
WHERE A.ID = B.ID AND B.CACTI_FLUX_URL IS NOT NULL )
LOOP
UPDATE NM_HARWARE SET CACTI_URL = NVL(ROW_REC.CACTI_FLUX_INFO)
WHERE ID = ROW_REC.ID ;
END LOOP
COMMIT ;
END ;
---------------------------------------------
方法六 。採用ORACLE 的MERGE 語句 。此方法適用於 表B 是表 A 的 一個子集。
MERGE INTO TABLE_A
using ( select id , b1 from TABLE_B ) B
ON (A.ID = B.ID )
WHEN MATCHED THEN UPDATE SET A1=B.b1
WHEN NOT MATCHED THEN INSERT INTO (ID , A1) VALUES (NULL , NULL ) ;
注意這個地方,被插入了一個空值.因為 TABLE_B 的ID=9984在A中不能匹配,
根本原因是ORACLE9必須有WHEN NOT MATCHED子句,
但是ORACLE10可以不許要,也就是ORACLE10可以不寫WHEN NOT MATCHED ,
就不必插入NULL值了,為解決這個問題,下一步會DELETE 表B 的ID=9984,
這樣一來就不會執行WHEN NOT MATCHED
或者在A表中把NULL 值的行 清除。
select nm_hardware.id as aid, nm_hardware.cacti_url , nm_server_info.id AS ID ,nm_server_info.CACTI_FLUX_URL AS CACTi_FLUX_URL
from nm_hardware,nm_server_info
where nm_hardware.id = nm_server_info.id
and nm_server_info.CACTI_FLUX_URL is not null
and nm_hardware.id in ( 1169,1182,1183)
upudate nm_hardware b set b.cacti_url = ( select a.CACTI_FLUX_URL from
nm_server_info a where a.id=b.id and a.cacti_flux_url is not null )
where exists ( select '1' from nm_hardware c ,nm_server_info d where c."id"=d."id" and c.cacti_flux_url is not null )
(select nm_server_info.id AS ID ,nm_server_info.CACTI_FLUX_URL AS CACTO_FLUX_URL
from nm_hardware,nm_server_info
where nm_hardware.id = nm_server_info.id
and nm_server_info.CACTI_FLUX_URL is not null) a where b.id=a.id)
--lsliang
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-731988/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql update join,insert select 語法MySql
- MySQL -update語句流程總結MySql
- MySQL update ...set後的and寫法的邏輯MySql
- select for update
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- Oracle中 Update和insert結合語法Oracle
- Laravel5.6 如何列印 SQL?insert/update/select 列印方法總結LaravelSQL
- DBeaver如何生成select,update,delete,insert語句delete
- HTML 語法總結HTML
- MySQL中UPDATE語句裡SET後使用AND的執行過程和結果分析MySql
- Mysql跨表更新 多表update sql語句總結MySql
- Leetcode: 627 - UPDATE, SET, ifLeetCode
- python 語法總結:Python語法快速入門Python
- Go語言基礎語法總結Go
- PHP高階語法總結PHP
- es6語法總結
- HTML5語法總結HTML
- selenium之xpath語法總結
- go 奇葩語法總結篇Go
- open policy agent 語法總結
- STL:set用法總結
- 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE
- sql查詢更新update selectSQL
- ES6常用語法總結
- 05-ES6語法總結
- Emmet外掛常用語法總結
- css基本語法總結及使用CSS
- Python筆記_1語法總結Python筆記
- java Set相關總結Java
- sql select語法執行順序SQL
- booststrap select2的應用總結
- ES6 語法學習總結
- 初學Solidity(一):語法大致總結Solid
- Vue3.2 setup語法糖總結Vue
- python基礎語法知識點總結Python
- 自頂向下語法分析複習總結語法分析
- UniRx精講(二):獨立的 Update &UniRx 的基本語法格式
- mysql關於字符集character set的總結MySql
- Oracle中select for update ...一些區別Oracle