oracle學習筆記 update一整列 關聯更新

2022-09-17 13:21:13 字數 2766 閱讀 8204

普通的update都是根據條件來對部分列的內容進行修改,用法如下:

update temp_cwh_table set name = '***'

where id = 1;

假設現在有2張表:a、b,需要關聯a、b表,根據相同的idupdatea表。

-- 建立測試表 temp_cwh_001

create table temp_cwh_001

( id int,

name varchar2(20)

);-- 插入資料

insert into temp_cwh_001 values (1,'aa');

insert into temp_cwh_001 values (2,'bb');

insert into temp_cwh_001 values (3,'cc');

-- 查詢

select * from temp_cwh_001

-- 1 1 aa

-- 2 2 bb

-- 3 3 cc

-- 建立測試表 temp_cwh_002

create table temp_cwh_002

( id int,

name varchar2(20)

);-- 插入資料

insert into temp_cwh_002 values (1,'cccc');

insert into temp_cwh_002 values (2,'dddd');

-- 查詢

select * from temp_cwh_002

-- 1 1 cccc

-- 2 2 dddd

-- 關聯更新

update temp_cwh_001 a

set name = (select b.name from temp_cwh_002 b where a.id = b.id);

-- 提交

commit;

-- 查詢

select * from temp_cwh_001;

-- 1 1 cccc

-- 2 2 dddd

-- 3 3

本意只是將關聯得上的內容進行update,關聯不上的內容不修改。但此用法下,關聯不上的內容直接被update為null,需再度優化。

-- 關聯更新

update temp_cwh_001 a

set name = (select b.name from temp_cwh_002 b where a.id = b.id)

where id = (select b.id from temp_cwh_002 b where a.id = b.id)

-- 提交

commit;

-- 查詢

select * from temp_cwh_001;

-- 1 1 cccc

-- 2 2 dddd

-- 3 3 cc

新增where條件過濾,符合條件。

-- 關聯更新

update temp_cwh_001 a

set name = (select b.name from temp_cwh_002 b where a.id = b.id)

where exists (select 1 from temp_cwh_002 b where a.id = b.id)

-- 提交

commit;

-- 查詢

select * from temp_cwh_001;

-- 1 1 cccc

-- 2 2 dddd

-- 3 3 cc

update (select a.name aname, 

a.id aid,

b.name bname,

b.id bid

from temp_cwh_001 a,

temp_cwh_002 b

where a.id = b.id)

set aname = bname

報錯:ora-01779: cannot modify a column which maps to a non key-preserved table

需要主鍵的支援

alter table temp_cwh_001 add primary key(id);

alter table temp_cwh_002 add primary key(id);

重新執行,便可。

這種方法的侷限性就是需要primary的支援。

可以使用儲存過程的方式進行靈活處理,不過這裡有點複雜。。暫且記錄。。

declare

cursor cur_wm is select name, id from temp_cwh_002;

begin

for my_wm in cur_wm loop

update temp_cwh_001 set name = my_wm.name

where id = my_wm.id;

end loop;

end;

執行之後,pl/sql procedure successfully completed.

oracle 學習筆記

本地網路服務名配置 在客戶機的 oracle oracle90 network admin 安裝目錄下有乙個名為tnsnames.ora的命名檔案,其中儲存的就是本地命名的配置.當客戶機應用程式提出登入要求時,其使用的連線字串被命名檔案解析.在命名檔案裡儲存的是與連線字串對應的網路位址.例如 mys...

Oracle學習筆記

許可權管理 oracle 9i 3個預設使用者 sys 超級管理員 預設密碼 change on install system 普通管理員 預設密碼 manager scott 普通使用者 預設密碼 tiger oracle 10g sys 密碼在安裝時設定 system 密碼在安裝時設定 scot...

oracle學習筆記

1 set linesize 100 設定長度 2 set pagesize 30 設定每頁顯示數目 3 em a.sql 開啟記事本 4 a 執行檔案a中的 可指定檔案的路徑 d a.txt 5 conn 使用者名稱 密碼 根據使用者名稱和密碼連線資料庫 如果連線超級管理員 sys 則應加上as ...