Oracle中的Merge命令

http://www.shift-the-oracle.com/sql/merge.html


SQL 入門 (DMLの基本形式:MERGE)

行の挿入と更新を 1ステートメントで行なう ( MERGE = UPDATE + INSERT ) Oracle 9i

行の挿入と更新を1ステートメントで行なう。他の DBMS では REPLACE の場合もある。
UPDATE と INSERT をもじって、UPSERT とも呼ばれる。(モデルファンクション内でも UPSERT のキーワードがある)

テーブルからテーブルにデータをエントリー(または更新)する

人事システムから最新のマスタ (USER_MASTER_IMPORT) を取得してきた。(と仮定する)
これを USER_MASTER に最新として反映させる。新規レコードには、名前に'(新人)'を付与する。

MERGE INTO USER_MASTER
USING USER_MASTER_IMPORT 
ON ( USER_MASTER.USER_ID = USER_MASTER_IMPORT.USER_ID)
-- 既存レコードの更新
WHEN MATCHED THEN
	UPDATE SET
		USER_NAME = USER_MASTER_IMPORT.USER_NAME,
		DEPT_NO = USER_MASTER_IMPORT.DEPT_NO,
		MODIFIED_ON = SYSDATE
-- 新規レコードの作成
WHEN NOT MATCHED THEN
	INSERT
		( USER_ID, USER_NAME, DEPT_NO )
	VALUES
		( USER_MASTER_IMPORT.USER_ID,
		USER_MASTER_IMPORT.USER_NAME || '(新人)',
		USER_MASTER_IMPORT.DEPT_NO )
  • 基本的なフォーマット
MERGE INTO <表名1 [エイリアス名]
USING 表名2 | 副問い合わせ [エイリアス名] 
ON ( <結合条件> )
WHEN MATCHED THEN
	UPDATE SET <カラム名> = < 値 >, …
WHEN NOT MATCHED THEN
	INSERT [ (<カラム名>, … ) ]
	VALUES ( <値> , … ) ;
MERGE の情報ソースにテーブルでなくリテラルを使用する

入力されるデータがテーブルではなくユーザー入力の リテラル 指定などによるデータの集まりの場合には DUAL 表 を使用した仮想テーブルにすることで INSERT と UPDATE の条件分岐が可能。
副問い合わせでなく DUAL だけでも書き換えが可能。しかし、副問い合わせを使用してすべてのリテラルを1ヵ所で記述することでリテラルの記述が重複したり、記述箇所を分散しないようにした方がわかりやすいだろう。

MERGE INTO USER_MASTER
USING (
	SELECT
		'0099' "USER_ID",
		'入力した名前' "USER_NAME",
		'0010' "DEPT_NO"
	FROM DUAL
) phantom
ON (USER_MASTER.USER_ID = phantom.USER_ID)
-- または
-- USING DUAL ON (USER_MASTER.USER_ID = '0099')
-- 
-- 既存レコードの更新
WHEN MATCHED THEN
	UPDATE SET
		USER_NAME = USER_NAME || '(更新)',
		MODIFIED_ON = SYSDATE
-- 新規レコードの作成
WHEN NOT MATCHED THEN
	INSERT
		( USER_ID, USER_NAME, DEPT_NO )
	VALUES
		(phantom.USER_ID, -- or '0099'
		 phantom.USER_NAME,-- or '入力した名前'
		 phantom.DEPT_NO ) -- or '0010'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值