将MERGE语句转换为UPDATE语句

gooner_psy
MERGE INTO TABLE1 t1
USING TABLE2 t2
ON (t1.ID = t2.ID) 
WHEN MATCHED THEN UPDATE 
  SET t1.PHONE_NUMBER = CASE 
                          WHEN t1.type in ('A','B') THEN  t2.phone_number 
                          ELSE NVL(t2.phone_number, t1.phone_number)
                        END

需要在上面转换MERGE成一个UPDATE语句。

我尝试了以下方法:

UPDATE TABLE1 t1 
   SET t1.PHONE_NUMBER = (
                          SELECT t2.PHONE_NUMBER 
                            FROM TABLE2 t2, TABLE1 t3 
                           WHERE t3.type in ('A','B') 
                             AND t3.ID = t2.ID
                         )

如何纳入CASE上述实现?

MT0

MERGE语句将更加有效,您可能应该使用它;但是,您可以使用:

UPDATE table1 t1
SET PHONE_NUMBER = NVL(
                     ( SELECT t2.phone_number
                       FROM   table2 t2
                       WHERE  t1.id = t2.id ),
                     CASE
                     WHEN t1.type IN ( 'A', 'B' )
                     THEN NULL
                     ELSE t1.phone_number
                     END
                   )
WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t1.id = t2.id );

Oracle安装程序

CREATE TABLE table1 ( id, phone_number, type ) AS
SELECT 1, 123456, 'A' FROM DUAL UNION ALL
SELECT 2, 123456, 'B' FROM DUAL UNION ALL
SELECT 3, 123456, 'C' FROM DUAL UNION ALL
SELECT 4, 123456, 'D' FROM DUAL UNION ALL
SELECT 5, 123456, 'E' FROM DUAL;

CREATE TABLE table2 ( id, phone_number ) AS
SELECT 1, 234567 FROM DUAL UNION ALL
SELECT 2, NULL   FROM DUAL UNION ALL
SELECT 3, 345678 FROM DUAL UNION ALL
SELECT 4, NULL   FROM DUAL;

输出

运行更新后,然后:

SELECT * FROM table1

输出与MERGE语句相同

ID | PHONE_NUMBER | TYPE- 
:| -----------:| | 
 -1 234567 | A    
 2 |         | B    
 3 | 345678 | C    
 4 | 123456 | D    
 5 | 123456 | Ë   

db <>在这里拨弄


更新

如果您查看EXPLAIN PLANMERGE声明:

| PLAN_TABLE_OUTPUT | 
| :------------------------------------------------- ----------------------------- | 
| 计划哈希值:3423411568 | 
| | 
| -------------------------------------------------- ----------------------------- | 
| | ID | 操作| 姓名| 行| 字节数| 费用(%CPU)| 时间| | 
| -------------------------------------------------- ----------------------------- | 
| | 0 | 合并声明| | 4 | 168 | 7(15)| 00:00:01 | |
| | 1 | 合并| 表1 | | | | | | 
| | 2 | 查看| | | | | | | 
| | * 3 | 哈希联接| | 4 | 268 | 7(15)| 00:00:01 | | 
| | 4 | 表访问已满| 表2 | 4 | 104 | 3(0)| 00:00:01 | | 
| | 5 | 表访问已满| 表1 | 5 | 205 | 3(0)| 00:00:01 | | 
| -------------------------------------------------- ----------------------------->

然后,它只能读取TABLE1TABLE2各一次。

将其EXPLAIN PLANUPDATE语句进行比较

| PLAN_TABLE_OUTPUT | 
| :------------------------------------------------- ---------------------------- | 
| 计划哈希值:735598124 | 
| | 
| -------------------------------------------------- ---------------------------- | 
| | ID | 操作| 姓名| 行| 字节数| 费用(%CPU)| 时间| | 
| -------------------------------------------------- ---------------------------- | 
| | 0 | 更新声明| | 4 | 168 | 23(22)| 00:00:01 | |
| | 1 | 更新| 表1 | | | | | |
| | * 2 | 哈希联接半| | 4 | 168 | 7(15)| 00:00:01 | | 
| | 3 | 表访问已满| 表1 | 5 | 145 | 3(0)| 00:00:01 | | 
| | 4 | 表访问已满| 表2 | 4 | 52 | 3(0)| 00:00:01 | | 
| | * 5 | 表访问已满| 表2 | 1 | 26 | 3(0)| 00:00:01 | | 
| -------------------------------------------------- ---------------------------- |

然后它将读取TABLE1一次和TABLE2两次;因此,该MERGE查询可能是性能更高的查询...。但是,UPDATE如果需要,您可以使用

db <>在这里拨弄

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章