如果要對某一個表根據某些條件判斷進行 Update or Insert 這個情況,一般最笨的作法是透過 程式進行判斷決定要 Update or Insert ,然而 Oracle 9i 新增了一個語法用於合併UPDATE和INSERT語句。透過MERGE語句,根據一張表或子查詢的連接條件對另外一張表進行查詢,連線條件比對上的進行UPDATE,無法比對的執行INSERT。這個語法只要一次全表掃描就完成了全部工作,執行效率要高於INSERT+UPDATE。
語法
/*语法:
MERGE [INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN merge_update_clause
WHEN NOT MATCHED THEN merge_insert_clause;
*/
參考 : Link
練習範例
當您想在 Oracle 資料庫中使用 MERGE
語句來合併資料時,通常會先建立兩個表格,一個作為目標表格,另一個作為源表格。以下是一個完整的範例,包括建立表格、插入資料、以及使用 MERGE
語句來進行合併操作 ( db 安裝可以參考 link )
1. 在建立目標表格
CREATE TABLE target_table (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
value NUMBER
);
2. 插入資料到目標表格
INSERT INTO target_table (id, name, value) VALUES (1, 'Alice', 10);
INSERT INTO target_table (id, name, value) VALUES (2, 'Bob', 20);
INSERT INTO target_table (id, name, value) VALUES (3, 'Charlie', 30);
3. 建立源表格
CREATE TABLE source_table (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
value NUMBER
);
4. 插入資料到源表格
INSERT INTO source_table (id, name, value) VALUES (2, 'Bob', 25);
INSERT INTO source_table (id, name, value) VALUES (3, 'Charlie', 35);
INSERT INTO source_table (id, name, value) VALUES (4, 'David', 40);
5. 使用 Merge into 語句合併資料
MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
UPDATE SET t.name = s.name, t.value = s.value
WHEN NOT MATCHED THEN
INSERT (id, name, value) VALUES (s.id, s.name, s.value);
6. 查詢結果
執行上述 SQL 語句後,target_table
的內容應該如下:
ID | NAME | VALUE |
1 | Alice | 10 |
2 | Bob | 25 |
3 | Charlie | 35 |
4 | David | 40 |
MERGE
語句將來自 source_table
的資料合併到 target_table
,當 id
匹配時更新目標表格中的資料,當 id
不匹配時插入新資料。