助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)

MERGE文 入れ替え

公開日 2024/07/24

知的好奇心として質問させていただきたいと思います。
MERGE文でMATCHEDとNOT MATCHEDの順番を入れ替えるとどうなるのでしょうか?エラーになりますか?

例えば、
MERGE INTO cust_copy c USING(SELECT id, UPPER(name) name, active FROM customers) p ON (c.id=p.id)
WHEN NOT MATCHED THEN
INSERT VALUES (p.id, p.name, p.active)
WHEN MATCHED THEN
UPDATE SET c.name=p.name, c.active=p.active;

参考:黒本10章 章末問題 問12

よろしくお願いいたします。

2024/07/24 20:31

「WHEN MATCHED THEN」と「WHEN NOT MATCHED THEN」の順序は入れ替えても、MERGE文としてはエラーにはなりません。
ご提示のケースでもエラーにはならず、実行後は同様の結果となりました。

SQL> select * from cust_source;

    ID NAME	  A EMAIL		 BIRTH_DAY
------ ---------- - -------------------- -----------
     1 scott	  Y scott@xx.com	 66-06-03
     2 allen	  N al@yy.com		 82-04-18
     3 john	  Y John@zz.com 	 73-12-30
     4 king	  Y king@zz.com 	 91-01-15

SQL> select * from cust_copy;

    ID NAME	  A
------ ---------- -
     1 SCOTT	  Y
     2 ALLEN	  Y
     3 TBD
     
SQL> MERGE INTO cust_copy c USING (SELECT id, UPPER(name) name, active FROM cust_source) p ON (c.id=p.id)
	WHEN NOT MATCHED THEN
		INSERT VALUES (p.id, p.name, p.active)
	WHEN MATCHED THEN
		UPDATE SET c.name=p.name, c.active=p.active;

4行がマージされました。

SQL> select * from cust_copy;

    ID NAME	  A
------ ---------- -
     1 SCOTT	  Y
     2 ALLEN	  N
     3 JOHN	  Y
     4 KING	  Y

SQL>

ただし、処理順序(条件を評価する順序)は変わると思うので、実運用においてはデータの内容によっては結果が異なる可能性はあります。
また、パフォーマンスにも違いが出てくる可能性はあると思います。(そのような場合には実行計画の取得などして、チューニングしていくことになると思います。)


コメント

J Jaune

2024/07/25 16:00

エラーにならずに実行されるんですね。 けど、結果が異なる可能性があるとのことなので、変に入れ替えたりせずに、MATCHED → NOT MATCHED の順番で書いた方が確実みたいですね。 助かりました、ありがとうございました。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?