Oracle Meger into 函式
阿新 • • 發佈:2018-12-28
Oracle 在 9i 引入了 merge 命令, 通過這個 merge 能夠在一個SQL 語句中對一個表同時執行 inserts 和 updates 操作。Merge into 可以實現用 B 表來更新 A 表資料(如果匹配上),如果 A 表中沒有,則把 B 表的資料插入 A 表中。
管中窺豹
MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-sql and using just like a table] ON ([conditional expression here] AND [...]...) WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]
舉個栗子:
merge into new_products p using old_products op
on (p.product_id = np.product_id)
when matched then
update set p.product_name = op.product_name
when not matched then
insert values(
op.product_id, op.product_name, op.category)
使用 old_products 表中的輸入插入 new_products 中,匹配關係為 on 後面的條件字句的內容。when matched then 就是根據匹配關係匹配上了,when not matched then 就是沒有匹配上需要做的相應操作。網上的一般資料都顯示在做 merge 的時候,這樣同樣的情況下,merge 的效能是優於同等功能的update/insert 語句的。
在Oracle 10g中MERGE有如下一些改進:
1、UPDATE 或 INSERT 子句是可選的
2、UPDATE 和 INSERT 子句可以加 WHERE 子句
3、UPDATE 子句後面可以跟 DELETE 子句來去除一些不需要的行
UPDATE 或 INSERT 子句是可選的
merge into new_products p using old_products op
on (p.product_id = np.product_id)
when matched then
update set p.product_name = op.product_name
when matched then 和 when not matched then 都是可選則引數,可以根據具體的業務型別來進行資料庫操作,而不用拘泥於原有特定的語法。
新增 WHERE 子句
merge into new_products p using old_products op
on (p.product_id = np.product_id)
when matched then
update set p.product_name = op.product_name where op.name like '%co2fe%'
when not matched then
insert values(
op.product_id, op.product_name, op.category) where op.name like '%co2fe%'
在添加了 where 條件之後我們的 update/insert 就會變得更加的靈活,能夠滿足更多的業務需求。
DELETE 子句來去除一些不需要的行
merge into new_products p using old_products op
on (p.product_id = np.product_id)
when matched then
update set p.product_name = op.product_name
delete where op.name like '%co2fe%'
when not matched then
insert values(
op.product_id, op.product_name, op.category)
同樣的,使用 delete 語句之後我們可以實現更多的功能和業務,擴充套件了 merge into 的使用面。
本文由個人 hexo 部落格 co2fe.com 遷移
date: 2017-09-12 15:38:41