MERGE 表,匹配时什么都不做

新手上路,请多包涵

I have a table DOMAINS in 2 different schemas with columns ID , NAME , CODE , DESCRIPTION .

对于新模式中存在的任何 NAME ,它应该使用现有的 ID 而不进行任何合并;对于那些新的 NAME 记录,它应该从旧模式插入 ID

 MERGE INTO DOMAINS A
USING (SELECT ID,NAME,CODE,DESCRIPTION FROM <Old Schema 6.1>.DOMAINS@DB_MIG_61_TO_74) B
ON(A.NAME = B.NAME)
WHEN MATCHED **<do nothing>**
WHEN NOT MATCHED THEN INSERT(A.ID,A.NAME,A.CODE,A.DESCRIPTION)
VALUES(B.ID,B.NAME,B.CODE,B.DESCRIPTION);

我如何解释 do nothing 在上述查询中的部分?

原文由 user2102665 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
1 个回答

对于您的情况,无需使用该部分:

WHEN MATCHED THEN UPDATE ...

使用 WHEN MATCHED THEN UPDATE SET a.id = a.id 被接受(Oracle 不会投掷)但没有影响,因此,这种用法是多余的,因为您不想为匹配的情况更改任何内容。

如果您想更改,请添加

WHEN MATCHED THEN UPDATE SET a.id = b.id

之前 WHEN NOT MATCHED THEN INSERT...

例如Oracle支持 WHEN MATCHED THEN UPDATE 语法。参考下面 的Demo

针对当前案例继续以下操作:

 SQL> CREATE TABLE domains(
                           id          INT,
                           name        VARCHAR2(50),
                           code        VARCHAR2(50),
                           description VARCHAR2(50)
                         );

SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');

SQL> MERGE INTO domains A USING
     (SELECT 2 id, 'Domain A' name, 'D.A.' code, 'This is Domain A' description
        FROM domains) b
          ON ( a.name = b.name )
        WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
                              VALUES( b.id, b.name, b.code, b.description );

SQL> SELECT * FROM domains;

ID  NAME        CODE    DESCRIPTION
--  --------   -----  ----------------
1   Domain A    D.A.  This is Domain A

SQL> DELETE domains;

SQL> INSERT INTO domains VALUES(1,'Domain A','D.A.','This is Domain A');
-- we're deleting and inserting the same row again

SQL> MERGE INTO domains A USING
 (SELECT 2 id, 'Domain B' name, 'D.B.' code, 'This is Domain B' description
    FROM domains) b
      ON ( a.name = b.name )
    WHEN NOT MATCHED THEN INSERT( a.id, a.name, a.code, a.description )
                          VALUES( b.id, b.name, b.code, b.description );

SQL> SELECT * FROM domains;

ID  NAME        CODE    DESCRIPTION
--  --------   -----  ----------------
1   Domain A    D.A.  This is Domain A
2   Domain B    D.B.  This is Domain B

演示

原文由 Barbaros Özhan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进