【问题标题】:While merging in Oracle 11g, I want to delete destination row that is not matching with source在 Oracle 11g 中合并时,我想删除与源不匹配的目标行
【发布时间】:2020-10-26 20:32:55
【问题描述】:
SQL> SELECT * FROM SOURCE;

 MEMBER_ID FIRST_NAME LAST_NAME  RANK
---------- ---------- ---------- --------------------
         1 Abel       Wolf       Gold
         2 Clarita    Franco     Platinum
         3 Darryl     Giles      Silver
         4 Dorthea    Suarez     Silver
         5 Katrina    Wheeler    Silver
         6 Lilian     Garza      Silver
         7 Ossie      Summers    Gold
         8 Paige      Mcfarland  Platinum
         9 Ronna      Britt      Platinum
        10 Tressie    Short      Bronze

10 rows selected.

SQL> SELECT * FROM DESTINATION;

 MEMBER_ID FIRST_NAME LAST_NAME  RANK
---------- ---------- ---------- --------------------
         1 Abel       Wolf       Silver
         2 Clarita    Franco     Platinum
         3 Darryl     Giles      Bronze
         4 Dorthea    Gate       Gold
         5 Katrina    Wheeler    Silver
         6 Lilian     Stark      Silver
        11 Chris      Well       Silver

7 rows selected.

当我尝试执行以下查询时,它正在执行,但没有从目标表中删除记录 11:

MERGE INTO DESTINATION D
USING SOURCE S
ON (D.MEMBER_ID = S.MEMBER_ID)
WHEN MATCHED THEN
  UPDATE
     SET D.FIRST_NAME = S.FIRST_NAME,
         D.LAST_NAME  = S.LAST_NAME,
         D.RANK       = S.RANK 
  DELETE
   WHERE D.MEMBER_ID <> S.MEMBER_ID
WHEN NOT MATCHED THEN
  INSERT
    (D.MEMBER_ID, D.FIRST_NAME, D.LAST_NAME, D.RANK)
  VALUES
    (S.MEMBER_ID, S.FIRST_NAME, S.LAST_NAME, S.RANK);

【问题讨论】:

    标签: sql oracle oracle11g sql-merge


    【解决方案1】:

    由于当前逻辑隐式使用INNER JOIN,而MEMBER_ID = 11在表SOURCE中不存在,所以这个值不会引起MATCHED的情况,因此从未被删除。

    您可以使用OUTER JOIN,例如FULL JOIN,如下所示

    MERGE INTO DESTINATION D
    USING (SELECT NVL(S.MEMBER_ID,D.MEMBER_ID) AS MEMBER_ID,S.FIRST_NAME, S.LAST_NAME, S.RANK 
             FROM DESTINATION D
             FULL JOIN SOURCE S
               ON S.MEMBER_ID = D.MEMBER_ID) S
       ON (NVL(S.MEMBER_ID,D.MEMBER_ID) = D.MEMBER_ID)
    WHEN MATCHED THEN
      UPDATE
         SET D.FIRST_NAME = S.FIRST_NAME,
             D.LAST_NAME  = S.LAST_NAME,
             D.RANK       = S.RANK 
      DELETE
       WHERE S.FIRST_NAME IS NULL
      WHEN NOT MATCHED THEN
      INSERT
        (D.MEMBER_ID, D.FIRST_NAME, D.LAST_NAME, D.RANK)
      VALUES
        (S.MEMBER_ID, S.FIRST_NAME, S.LAST_NAME, S.RANK);
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2013-11-17
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多