助け合いフォーラム
知的好奇心として質問させていただきたいと思います。
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
よろしくお願いいたします。
r
rink_rew
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 の順番で書いた方が確実みたいですね。 助かりました、ありがとうございました。