TableA 的內容修改 TableB
將 Table A 的欄位資料 Set 到Table B
因為 SQL 的 update 語法是不允許用 Alias
所以註記批次更改時的重點
- 重點摘要:
- 被改的 table 不可用別名
- 兩 table 資料筆數不同時,要注意資料被清空的情形
情境
- 假設我們有以下兩個 Tables:
- TARGET_TABLE:
- SOURCE_TABLE:
- 各有一筆資料無法 mapping
-- target_table: 我們要更新的資料表
CREATE TABLE TARGET_TABLE (
id INT PRIMARY KEY,
value_to_update VARCHAR(255),
other_data VARCHAR(255)
);
-- source_table: 包含新資料的資料表
CREATE TABLE SOURCE_TABLE (
id INT PRIMARY KEY,
new_value VARCHAR(255),
some_other_info VARCHAR(255)
);
-- 範例資料
INSERT INTO TARGET_TABLE (id, value_to_update, other_data) VALUES
(1, 'Old Value 1', 'Target Data A'),
(2, 'Old Value 2', 'Target Data B'),
(3, 'Old Value 3', 'Target Data C'); -- Source 缺此資料
INSERT INTO SOURCE_TABLE (id, new_value, some_other_info) VALUES
(1, 'New Value for ID 1', 'Source Info X'),
(2, 'New Value for ID 2', 'Source Info Y'),
(4, 'New Value for ID 4', 'Source Info Z'); -- Target 無此資料
update 批次更新指令: 有新值才 update
- 注意事項:
- 目的: 只 將 Source 列出的內容更新到 Target Table。
Target 查無對應新值則不動作
。 - TARGET_TABLE 被改的 table 不可用別名 ,值接以 TableName 當 identifier
- Source 取值的片段不可出現 select 字眼
- set value 片段不可以加 select 關鍵字
- 若加上 select ,看似結果正常,實則當 Source vs Target 筆數不同時,會造成非預期的 Upldate (資料 update 為 null)。
- 目的: 只 將 Source 列出的內容更新到 Target Table。
-- Target 不可使用 alias/ Source 可用可不用 UPDATE TARGET_TABLE SET value_to_update = SOURCE_TABLE.new_value FROM SOURCE_TABLE WHERE TARGET_TABLE .id = SOURCE_TABLE.id;
-- Source 可採用 alias UPDATE TARGET_TABLE SET value_to_update = src.new_value FROM SOURCE_TABLE src WHERE TARGET_TABLE .id = src.id;
-- 驗證更新結果 SELECT * FROM TARGET_TABLE;
小心相似語法: 無新值清空
- 下面的範例
set value
片段多加select
關鍵字,與上方範例作用完全不同。 - 此語法是,Target 逐一查找 Source,若查無 Source 則當缺值更新 Target。
- 當 Source 中查無 Target 所要的 mapping record 後,仍會進行資料更新。也就是清除。
-- 下面的 SQL --> 查無資料則以 null 更新
-- UPDATE target_table
-- SET value_to_update =
-- (select s.new_value FROM source_table s WHERE target_table.id = s.id) ; -- 查無資料則以 null 更新