跳至主要内容

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 字眼

-- 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 更新