[英]MERGE with multiple UPDATE statements
我们可以使用单个 MERGE 语句实现以下场景:
源表 - 表 1 目标表 - 表 2
当 table1.id 在 table2.id 然后更新 table1 SET phone_number=123456
当 table1.id 不在 table2.id 然后更新 table1 SET phone_number=555555
注意:-我能够使用以下查询获得结果。
MERGE INTO table1 tbl1
USING table2 tbl2
ON (tbl1.id = tbl2.id)
WHEN MATCHED THEN
UPDATE SET tbl1.phone_number=123456;
update table1 set phone_number = 555555 where id not in (select id from table2);
有没有办法只使用 MERGE Statement 来实现它?
只需使用UPDATE
语句:
甲骨文设置:
CREATE TABLE table1 ( id, phone_number ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 2 FROM DUAL;
CREATE TABLE table2 ( id ) AS
SELECT 1 FROM DUAL UNION ALL
SELECT 3 FROM DUAL;
更新:
UPDATE table1 t1
SET phone_number = COALESCE(
(
SELECT 123456
FROM table2 t2
WHERE t1.id = t2.id
),
555555
)
输出:
SELECT *
FROM table1
\n身份证 | 电话号码\n -: | -----------:\n 1 | 123456\n 2 | 555555\n
db<> 在这里小提琴
你正在寻找一个语法MERGE
在SQL Server中存在语句,但不是有效的Oracle数据库:
MERGE INTO table1 t1
USING table2 t2
ON ( t1.id = t2.id )
WHEN MATCHED THEN
UPDATE SET phone_number = 123456
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET phone_number = 555555;
db<> 在这里摆弄
如果没有匹配的行,则不能使用UPDATE
(在WHEN NOT MATCHED
)。 由于没有匹配的行,那么应该更新哪些数据?
正常的合并语句必须具有以下结构:
MERGE <hint> INTO <table_name> USING <table_view_or_query> ON (<condition>) WHEN MATCHED THEN <update_clause> DELETE <where_clause> WHEN NOT MATCHED THEN <insert_clause> [LOG ERRORS <log_errors_clause> <reject limit <integer | unlimited>];
当没有匹配时,oracle 在target
表中找不到与使用ON
条件匹配的source
表的行,那么它如何更新记录? 它将更新哪个记录?
在oracle 文档中, WHEN NOT MATCHED
如下所示:
您可以使用MERGE处理您的场景,如下所示:
-- Oracle 数据创建
SQL> CREATE TABLE table1 ( id number, phone_number number ); Table created. SQL> INSERT INTO table1 2 SELECT 1, 111 from dual UNION ALL 3 SELECT 2, 222 from dual UNION ALL 4 SELECT 3, 333 from dual UNION ALL 5 SELECT 4, 444 from dual; 4 rows created. SQL> drop table table2; Table dropped. SQL> CREATE TABLE table2 ( id number ); Table created. SQL> INSERT INTO table2 2 SELECT 1 from dual UNION ALL 3 SELECT 2 from dual; 2 rows created.
-- 您的合并声明
SQL> MERGE INTO TABLE1 TBL1 2 USING ( 3 SELECT T1.ID, T2.ID AS T2ID 4 FROM TABLE1 T1 5 LEFT JOIN TABLE2 T2 ON T1.ID = T2.ID 6 ) 7 TBL2 ON ( TBL1.ID = TBL2.ID ) 8 WHEN MATCHED THEN 9 UPDATE SET TBL1.PHONE_NUMBER = NVL2(TBL2.T2ID, 123456, 555555); 4 rows merged.
- 结果
SQL> SELECT * FROM TABLE1; ID PHONE_NUMBER ---------- ------------ 1 123456 2 123456 3 555555 4 555555 SQL>
干杯!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.