一、根據查詢到的結果更新一列數據
update A set A.name = (select B.name from B where A.id_no = B.id); -- A表的 id_no和B表的 id作為A表和B表的關聯,確保A表中對應的 id_no只有一個name值需要更新
(小提示:Sql Server中是通過update...from...來做到類似的操作,MySQL也有自己的方式實現,但是Oracle並不通用)
二、根據查詢到的結果更新多列數據
1、通過相關子查詢
update A set (A.name , A.score) = (select B.name , B.score from B where A.id_no = B.id); -- 這里的理解和更新一列數據的SQL是相同的。
-- 按照更新一列的邏輯和Oracle常用的多個數據更新習慣,應該是有幾個屬性需要更新就有幾個對應的子查詢,例如:
update A set A.name = (select B.name from B where A.id_no = B.id) ,A.score= (select B.score from B where A.id_no = B.id); -- 上面的SQL相當於對同一張表獲取的數據做了一個簡寫
2、通過內聯視圖
update ( select A.id_no Aid_no , A.name Aname, A.score Ascore, B.id Bid, B.name Bname, B.score Bscore from A inner join B on (A.id_no = B.id) ) set Aname = Bname, Ascore = Bscore;
(注:這種方式也適合更新單列的數據。這里就是把需要更新的數據和用於更新的數據放到同一個視圖中然后對這個視圖根據視圖自己的數據來進行更新。)
3、通過Merge into來實現更新
Merge into的用法就是向一張表里插入數據的時候進行判斷,如果表里沒有則新增;如果存在則修改,所以這里可以利用來做批量的修改。(最后兩個鏈接轉載對merge into的介紹)
merge into A using B on A.id_no = B.id when matched then update set A.name = B.name when not matched then insert (A.id_no, A.name, A.score) values (B.id, B.name, B.score);
(這里最好是確認B表的數據是A表都有的或者B表就是查詢出的對應的數據;還有就是對插入新數據的部分when not matched then做處理,這里要看版本。)
注意:以上的update腳本都沒有加where條件,會更新對應列的所有數據,有關聯的會更新成對應的數據,沒有關聯的會更新為NULL。
參考信息:https://www.linuxidc.com/Linux/2014-06/103552.htm、https://bbs.csdn.net/topics/340196496、