SQLの最近のブログ記事

画面から入力した顧客番号と担当者CDをもとに HIGEHOGE_TBL を検索し、レコードが存在していれば UPDATE し、存在していなければ INSERT をする SQL。

MERGE で書いてみた。

MERGE INTO
    HOGEHOGE_TBL A
    USING (
        SELECT
            KYAKU_NO,
            TANTOU_CD
        FROM
            HOGEHOGE_TBL
        WHERE
            KYAKU_TNO = '画面.顧客番号' AND
            TANTOU_CD = '画面.担当者CD'
        ) B
    ON (
        A.KYAKU_NO = B.KYAKU_NO AND
        A.TANTOU_CD = B.TANTOU_CD
        )
WHEN MATCHED THEN
    UPDATE SET
        MEMO = '画面.メモ',
        U_DATE = TRUNC(SYSDATE)
WHEN NOT MATCHED THEN
    INSERT
        (
        KYAKU_NO,
        TANTOU_CD,
        MEMO,
        I_DATE,
        U_DATE
        )
    VALUES
        (
        '画面.顧客番号',
        '画面.担当者CD',
        '画面.メモ',
        TRUNC(SYSDATE),
        TRUNC(SYSDATE)
        )

そしたら、一緒に仕事をしている若者から指摘された。

「これじゃあ、USING のところで検索結果が空のときに、'画面.顧客番号'と'画面.担当者CD' が ON 条件で使われないので駄目っすよ。必ず '画面.顧客番号'と'画面.担当者CD' が返るように組まないと駄目っす。」と。

なるほど。言われてみればそのとおり。

正解は、

USING (
    SELECT   
        '画面.顧客番号' KYAKU_NO,
        '画面.担当者CD' TANTOU_CD
    FROM   
        DUAL
    ) B
ON (
    A.KYAKU_NO = B.KYAKU_NO AND
    A.TANTOU_CD = B.TANTOU_CD
    )

または、いっそのこと、

USING
    DUAL
ON (
    A.KYAKU_TNO = '画面.顧客番号' AND
    A.TANTOU_CD = '画面.担当者CD'
    )

でもいいかな?

・・・こうして、世代交代が進んでいく。
(つか、MERGE 使うの初めてなんで許してくれ(^^;)