Oracle表關聯更新幾種方法

1、測試表及數據準備

create table T_update01(ID int ,infoname varchar2(32),sys_guid varchar2(36));
create table T_update02(ID int ,infoname varchar2(32),sys_guid varchar2(36));insert into T_update01
select 1,N'1_updateName',sys_guid() from dual
union
select 2,N'2_updateName',sys_guid() from dual;
commit;insert into T_update02
select 1,N'update_set_exists',sys_guid() from dual;
insert into T_update02
select 2,N'update_set_cursor',sys_guid() from dual;
insert into T_update02
select 3,N'3_Name',sys_guid() from dual;
commit;-- 查詢表T_update01、T_update02
select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 1_updateName                   189F5A1099BF6606E0639C0AA8C0F15E2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15Eselect * from T_update02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E

2、update set column ... where exists

2.1、update set 單列字段

-- update set 單列字段,更新滿足關聯條件的所有數據
update T_update01 T1
set infoname=(select T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where exists (select 1 from T_update02 T2 where T2.ID=T1.ID );-- update set 單列字段 ,更新滿足特定條件ID=1的數據
update T_update01 T1
set infoname=(select T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where T1.ID=1;-- 本次執行更新滿足特定條件T_update01表的ID=1
SCOTT@prod02> select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099BF6606E0639C0AA8C0F15E2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E

2.2、update set 多列字段

-- T_update01表多插入一行數據
insert into T_update01
select 3,N'insert03',sys_guid() from dual;
commit;select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099BF6606E0639C0AA8C0F15E2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E3 insert03                       189F5A1099C76606E0639C0AA8C0F15Eupdate T_update01 T1 
set (sys_guid,infoname) = (select T2.sys_guid,T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where exists (select 1 from T_update02 T2 where T2.ID=T1.ID );
commit;
-- 更新后檢查,sys_guid,infoname兩列的值和T_update02一樣了
select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E3 3_Name                         189F5A1099C66606E0639C0AA8C0F15Eselect * from T_update02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E

3、使用游標

-- T_update02數據更新一下,方便使用游標更新的結果顯示
update T_update02 set INFONAME='cursor is select' where id>=2;
commit;
select * from T_update02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E3 cursor is select               189F5A1099C66606E0639C0AA8C0F15E-- 使用用游標更新T_update01的INFONAME字段,使其和T_update02 where id>=2
declarecursor cur_my_source is select infoname,id from T_update02;beginfor cur_my_target in cur_my_source loopupdate T_update01 set infoname=cur_my_target.infoname where id=cur_my_target.id;end loop;commit;end;/-- 檢查查詢結果
select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E3 cursor is select               189F5A1099C66606E0639C0AA8C0F15E

4、merge into子句

create table T_merg01(ID int ,infoname varchar2(32),sys_guid varchar2(36));
create table T_merg02(ID int ,infoname varchar2(32),sys_guid varchar2(36));insert into T_merg01
select 1,N'1_Name',sys_guid() from dual
union
select 2,N'2_Name',sys_guid() from dual;
commit;select * from T_merg01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 1_Name                         189F5A1099BB6606E0639C0AA8C0F15E2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15Einsert into T_merg02
select 1,N'merge_into_Name1',sys_guid() from dual;insert into T_merg02 
select 3,N'3_Name',sys_guid() from dual;select * from T_merg02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 merge_into_Name1               189F5A1099BD6606E0639C0AA8C0F15E3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15Emerge into T_merg01 T1
using T_merg02 T2 on (T1.id=T2.id)
when matched then update set infoname=T2.infoname
when not matched then insert (ID,infoname,sys_guid) values(T2.ID ,T2.infoname,T2.sys_guid);commit;select * from T_merg01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 merge_into_Name1               189F5A1099BB6606E0639C0AA8C0F15E2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15E3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15E
-- 可以發現T_merg01表的ID=1的INFONAME=merge_into_Name1和T_merg02表ID=1的值一樣了
-- 可以發現T_merg01表多了一行數據是T_merg02表ID=3的這一行數據

5、Oracle 23c/AI?新特性

不論是已發版本Oracle23c free還是最終發布的長期支持的Oracle23Ai,表關聯更新update和刪除delete語句易用且更加優雅,類似SQLServer的關聯更新

以下操作基于的環境

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Fri May 17 11:17:54 2024
Version 23.2.0.0.0


5.1、關聯更新update

TESTUSER@FREEPDB1> create table t_emp as select EMPLOYEE_ID,DEPARTMENT_ID,SALARY from employees;Table created.TESTUSER@FREEPDB1> desc t_emp;Name                                      Null?    Type----------------------------------------- -------- ----------------------------EMPLOYEE_ID                                        NUMBER(6)DEPARTMENT_ID                                      NUMBER(4)SALARY                                             NUMBER(8,2)TESTUSER@FREEPDB1> select * from t_emp where DEPARTMENT_ID=110;EMPLOYEE_ID DEPARTMENT_ID     SALARY
----------- ------------- ----------205           110      12008206           110       8300TESTUSER@FREEPDB1> update t_emp set DEPARTMENT_ID=null,SALARY=null where DEPARTMENT_ID=110;2 rows updated.TESTUSER@FREEPDB1> commit;Commit complete.TESTUSER@FREEPDB1> select * from t_emp where DEPARTMENT_ID is null;EMPLOYEE_ID DEPARTMENT_ID     SALARY
----------- ------------- ----------178                     7000205206
-- oracle 23c SQL增強 表關聯更新        
TESTUSER@FREEPDB1> update t_emp t1 set t1.DEPARTMENT_ID=t2.DEPARTMENT_ID,t1.SALARY=t2.SALARY from employees t2 where t2.EMPLOYEE_ID=t1.EMPLOYEE_ID and t1.DEPARTMENT_ID is null;3 row updated.TESTUSER@FREEPDB1> commit;Commit complete.TESTUSER@FREEPDB1> select t1.* from t_emp t1 where t1.DEPARTMENT_ID=110;
EMPLOYEE_ID DEPARTMENT_ID     SALARY
----------- ------------- ----------205           110      12008206           110       8300

5.2、關聯刪除delete

TESTUSER@FREEPDB1> delete t_emp t1 from employees t2 where t2.EMPLOYEE_ID=t1.EMPLOYEE_ID and t2.DEPARTMENT_ID=110;45 rows deleted.TESTUSER@FREEPDB1> commit;Commit complete.TESTUSER@FREEPDB1> select t1.* from t_emp t1 where t1.DEPARTMENT_ID=110;no rows selected

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14200.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java如何獲取IP和IP的歸屬地?

在Java中,獲取IP地址通常指的是獲取本地機器的IP地址或者通過某種方式(如HTTP請求)獲取的遠程IP地址。代碼案例如下: 而要獲取IP的歸屬地(地理位置信息),則通常需要使用第三方IP地址查詢服務,我…

c++ 排序算法merge使用要求

在C中&#xff0c;std::merge是一個算法&#xff0c;它用于合并兩個已排序的范圍&#xff08;例如數組或容器中的一部分&#xff09;到一個新的范圍中。這個函數在<algorithm>頭文件中定義。 輸入范圍必須已排序 std::merge要求輸入的兩個范圍都必須是已排序的&#xf…

23種設計模式順口溜

口訣&#xff1a; 原型 抽風 &#xff0c;單獨 建造 工廠 &#xff08;寓意&#xff1a;&#xff08;這里代指本來很簡單的東西&#xff0c;卻要干工廠這里復雜的業務&#xff09; 抽風&#xff1a;抽象工廠單獨&#xff1a;單例橋代理組合享元適配器&#xff0c;&#xff0…

Microsoft VBA Excel 去重小工具

問題簡述 在本工作表中&#xff0c;A1:B3單元格樣式如下&#xff0c;通過名稱管理器B列的單元格被命名為"LinkFile"、“SheetName”、“InputArea”&#xff0c;請實現以下功能&#xff1a;讀取Excel文件中的數據&#xff0c;去除重復的數據&#xff0c;并記錄每個數…

亞馬遜云科技介紹

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《C》 《Linux》 ??感謝大家點贊&#x1f44d;收藏?評論?? 文章目錄 一、亞馬遜云科技云計算1.1 云計算的優勢 二、領先的云平臺三、亞馬遜云科技區域的全球網絡…

最簡單的,在mac筆記本上安裝Unix-v6系統,進行“Unix內核源碼剖析”

Unix V6 已經是 1975 年的系統了&#xff0c;但是其源代碼攏共只有 1w 行左右&#xff0c;并且使用了 C 語言&#xff08;K & R 之前的標準&#xff09;&#xff0c;還是現代操作系統的鼻祖&#xff0c;所以說是初學者最好的研究對象。 安裝模擬器 brew install simh …

【MySQL精通之路】SQL優化(1)-查詢優化(3)-索引合并

主博客&#xff1a; 【MySQL精通之路】SQL優化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL優化(1)-查詢優化(2)-范圍查詢優化-CSDN博客 下一篇&#xff1a; 目錄 1.索引合并-交集訪問算法 2.索引合并聯合訪問算法 3.索引合并-排序聯合訪問算法 4.影響索引合…

平衡發展與環保:理性看待地下式污水處理廠建設|中聯環保圈

這些年啊&#xff0c;隨著城市化進程越來越快&#xff0c;還有環境保護意識不斷提高&#xff0c;這地下式污水處理廠慢慢就成了熱門的建設趨勢了。據相關統計&#xff0c;全球現在運行著 200 多座地下式污水處理廠呢&#xff0c;咱國家建成和在建的數量也差不多快到 200 座啦。…

基于transformers框架實踐Bert系列4-文本相似度

本系列用于Bert模型實踐實際場景&#xff0c;分別包括分類器、命名實體識別、選擇題、文本摘要等等。&#xff08;關于Bert的結構和詳細這里就不做講解&#xff0c;但了解Bert的基本結構是做實踐的基礎&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

STM32入門筆記(02):USART串口通信注意事項筆記(SPL庫函數版)

這是通過串口通信發送過來的數據&#xff0c;里面包括了故障碼&#xff0c;電壓&#xff0c;電流&#xff0c;頻率等信息&#xff0c;請你用STM32f103系列單片機的串口1讀取該數據并解析出電壓和電流是多少&#xff1f; 要用STM32F103系列單片機的串口1讀取并解析發電機上的逆…

【Django項目】 音樂網站spotify復刻

代碼&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;該項目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口獲取。

docker 命令總結

導出鏡像下載 centos 鏡像 docker pull centos:centos7.7.1908 常用命令 docker ps 查看正在運行的容器 docker ps -a 查看所有容器 docker images 查看本地已有鏡像 停止所有容器 docker stop $(docker ps -aq) 停止某個容器 docker stop 容器名稱 刪除所有容器 dock…

Java基礎入門day54

day54 servlet升級03 特點 當前設計又有一個問題&#xff0c;我們目前可以做到一個實體類用一個servlet&#xff0c;比如Student類的所有crud方法都可以在StudentServlet中的service方法中進行動態處理。假如又有User類&#xff0c;我們就要在UserServlet中設計service方法&a…

探索文檔識別技術在加強教育資源共享與合作中的潛力

在數字化浪潮不斷推進的今天&#xff0c;教育資源的共享與合作已經成為提高教學質量和效率的關鍵因素。文檔識別技術作為一項強大的工具&#xff0c;在這一過程中發揮著至關重要的作用。本文旨在探討如何通過文檔識別技術的應用&#xff0c;促進教育資源的有效共享與教師、學校…

MySQL主從復制故障:“ Slave_SQL_Running:No“ 兩種解決辦法

問題 今天搭建MySQL的主從復制&#xff0c;查看從機狀態時show slave status\G&#xff0c;發現這個參數為NO&#xff0c;導致主從復制失敗。 Slave_SQL_Running: No 后面上網查閱了一下資料&#xff0c;大概就是因為在連接支持數據庫后&#xff0c;也就是這個命令后&#xff…

Adobe產品安裝目錄修改

進入安裝包目錄&#xff0c;進入到products文件夾 編輯driver.xml文件 將“InstallDir”修改為你需要安裝的軟件的目錄&#xff0c;我這里是修改到D:\Adobe目錄 <DriverInfo> <ProductInfo> xxxxxxxxxxxxxxxxx </ProductInfo> 拷貝RequestInfo這部分…

c-lodop 打印面單 內容串頁

場景&#xff1a;使用c-lodop程序調取打印機連續打印多張快遞單時&#xff0c;上頁內容&#xff0c;打到了下一頁了 問題原因&#xff1a; 由于是將所有面單內容放到了一個頁面&#xff0c;c-lodop 在打印時&#xff0c;發現一頁放不下&#xff0c;會自動分割成多頁 頁面元素…

【在Postman中,如果后端返回的是String類型的數據但不是JSON格式,報錯】

在Postman中&#xff0c;如果后端返回的是String類型的數據但不是JSON格式 問題描述解決辦法 postman后端返回的String數據,不是json,怎么設置結果的接收&#xff1f; 問題描述 在postman中測試接口&#xff0c;報錯Error&#xff1a;Abort&#xff0c;或者顯示返回數據校驗失…