Oracle9i以降でInsertとUpdateを一発で書く(MERGE)

探してみたらあるもんだ。一部でUpsertとか言われてるらしいw
(単に知らなかっただけとも言うw)

DBの更新作業で、データがあったらUpdate、無ければInsertを一発で書ける方法。
(※Oracle 9i以降)
MERGE INTOって関数があるんだって。

しかも同一表をDUAL表を使ってMERGEかける方法。(複数条件版)

MERGE INTO HOGE_TABLE A
    USING ( SELECT 'A01' U_ID,
                    '500' C_CODE
               FROM DUAL ) B
    ON ( A.USER_ID = B.U_ID  AND
         A.HOGE_CODE = B.C_CODE )
    WHEN MATCHED THEN
        UPDATE SET
            A.DATA1 = '0000001',
            A.DATA2 = B.C_CODE
    WHEN NOT MATCHED THEN
        INSERT (
                 USER_ID,
                 HOGE_CODE,
                 DATA1,
                 DATA2,
                 DATA3
        ) VALUES (
                 B.U_ID,
                 B.C_CODE,
                 '0000001',
                 B.C_CODE,
                 ( SELECT MAX(C.DATA1) + 1 FROM HOGE_TABLE C
                    WHERE C.USER_ID = B.U_ID AND
                          C.HOGE_CODE = B.C_CODE )
        );

思い出しながら今書いてるから、間違えてて後で直す可能性もありw

いくつかググって見たんだけど、USINGの複数条件がなぜか”AND”じゃ無くて”,”で説明されているサイトが多く、今日かなり悩んだ・・・。
後はVALUESの中で直に副問合せが書けるってぐらいかなぁ。
なんとなくSQL判ってきたかもww(いまさら?w

昔SQLServerで同じ実装を@@ROWCOUNT取って一発で2本のSQLを発行するってロジック組んだことあるんだけど、それを標準で実装してくれたようなもんだよね。

いやぁ、便利な世の中になったもんだ(そうなのか?w

コメント

タイトルとURLをコピーしました