最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle表關(guān)聯(lián)更新幾種方法小結(jié)

 更新時(shí)間:2024年05月24日 11:54:42   作者:zxrhhm  
這篇文章主要介紹了Oracle表關(guān)聯(lián)更新幾種方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

1、測(cè)試表及數(shù)據(jù)準(zhǔn)備

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                   189F5A1099BF6606E0639C0AA8C0F15E
         2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E
 
select * from T_update02;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E
         2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E

2、update set column ... where exists

2.1、update set 單列字段

-- update set 單列字段,更新滿足關(guān)聯(lián)條件的所有數(shù)據(jù)
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的數(shù)據(jù)
update T_update01 T1
set infoname=(select T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where T1.ID=1;
 
-- 本次執(zhí)行更新滿足特定條件T_update01表的ID=1
SCOTT@prod02> select * from T_update01;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099BF6606E0639C0AA8C0F15E
         2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E

2.2、update set 多列字段

-- T_update01表多插入一行數(shù)據(jù)
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              189F5A1099BF6606E0639C0AA8C0F15E
         2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E
         3 insert03                       189F5A1099C76606E0639C0AA8C0F15E
 
update 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              189F5A1099C46606E0639C0AA8C0F15E
         2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E
 
select * from T_update02;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E
         2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E

3、使用游標(biāo)

-- T_update02數(shù)據(jù)更新一下,方便使用游標(biāo)更新的結(jié)果顯示
update T_update02 set INFONAME='cursor is select' where id>=2;
commit;
select * from T_update02;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E
         2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E
         3 cursor is select               189F5A1099C66606E0639C0AA8C0F15E
 
-- 使用用游標(biāo)更新T_update01的INFONAME字段,使其和T_update02 where id>=2
declare
  cursor cur_my_source is select infoname,id from T_update02;
  begin
     for cur_my_target in cur_my_source loop
       update T_update01 set infoname=cur_my_target.infoname where id=cur_my_target.id;
     end loop;
	 commit;
 end;
 /
 
-- 檢查查詢結(jié)果
select * from T_update01;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E
         2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E
         3 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                         189F5A1099BB6606E0639C0AA8C0F15E
         2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15E
 
 
insert 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               189F5A1099BD6606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15E
 
 
merge 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               189F5A1099BB6606E0639C0AA8C0F15E
         2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15E
-- 可以發(fā)現(xiàn)T_merg01表的ID=1的INFONAME=merge_into_Name1和T_merg02表ID=1的值一樣了
-- 可以發(fā)現(xiàn)T_merg01表多了一行數(shù)據(jù)是T_merg02表ID=3的這一行數(shù)據(jù)

5、Oracle 23c/AI 新特性

不論是已發(fā)版本Oracle23c free還是最終發(fā)布的長(zhǎng)期支持的Oracle23Ai,表關(guān)聯(lián)更新update和刪除delete語句易用且更加優(yōu)雅,類似SQLServer的關(guān)聯(lián)更新

以下操作基于的環(huán)境

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、關(guān)聯(lián)更新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      12008
        206           110       8300
 
TESTUSER@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                     7000
        205
        206
-- oracle 23c SQL增強(qiáng) 表關(guān)聯(lián)更新        
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      12008
        206           110       8300
 

5.2、關(guān)聯(lián)刪除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

以上就是Oracle表關(guān)聯(lián)更新幾種方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Oracle表關(guān)聯(lián)更新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

奉化市| 金门县| 齐河县| 越西县| 湟中县| 郧西县| 云和县| 关岭| 大悟县| 深州市| 松潘县| 肇东市| 庆云县| 湖州市| 利川市| 聂拉木县| 通许县| 沙湾县| 南京市| 大宁县| 黄骅市| 克什克腾旗| 工布江达县| 辛集市| 礼泉县| 阿克陶县| 进贤县| 渭源县| 台中县| 兰西县| 灌云县| 新郑市| 正阳县| 若羌县| 江孜县| 靖江市| 新源县| 阳山县| 罗定市| 霍山县| 卫辉市|