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 语句相同:
身份证 |电话号码 |类型
-: | ------------: | :---
1 | 234567 |一种
2 | 空 |乙
3 | 345678 | C
4 | 123456 | D
5 | 123456 |乙
db小提琴here
更新:
如果您查看EXPLAIN PLAN 中的MERGE 语句:
|计划表输出 |
| :------------------------------------------------ ------------------------------ |
|计划哈希值:3423411568 |
| |
| -------------------------------------------------- ------------------------------ |
| |身份证 |操作 |姓名 |行 |字节 |成本 (%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 | |
| -------------------------------------------------- ----------------------------->
那么它只读取TABLE1 和TABLE2 各一次。
将其与EXPLAIN PLAN 的UPDATE 语句进行比较:
|计划表输出 |
| :------------------------------------------------ ---------------------------------------- |
|计划哈希值:735598124 |
| |
| -------------------------------------------------- ---------------------------------------- |
| |身份证 |操作 |姓名 |行 |字节 |成本 (%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小提琴here