簡體   English   中英

使用多個 UPDATE 語句合並

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM