📜  SQL 中的 MERGE 语句解释

📅  最后修改于: 2021-09-08 15:32:35             🧑  作者: Mango

先决条件 – MERGE 语句
SQL 中的 MERGE 语句,如前一篇文章中所讨论的,是三个 INSERT、DELETE 和 UPDATE 语句的组合。所以如果有一个Source表和一个Target表要合并,那么在MERGE语句的帮助下,这三个操作(INSERT、UPDATE、DELETE)可以同时执行。

一个简单的例子将阐明 MERGE 语句的使用。
例子:

假设有两个表:

  1. PRODUCT_LIST该表包含可用产品的当前详细信息,字段 P_ID、P_NAME 和 P_PRICE 对应于每个产品的 ID、名称和价格。
  2. UPDATED_LIST该表包含可用产品的新详细信息,字段 P_ID、P_NAME 和 P_PRICE 对应于每个产品的 ID、名称和价格。

任务是根据 UPDATED_LIST 更新 PRODUCT_LIST 中产品的详细信息。

解决方案
现在为了更好地解释这个例子,让我们把这个例子分成几个步骤。

  • 步骤 1:识别 TARGET 和 SOURCE 表
    因此,在此示例中,由于要求根据 UPDATED_LIST 更新 PRODUCT_LIST 中的产品,因此 PRODUCT_LIST 将充当 TARGET,UPDATED_LIST 将充当 SOURCE 表。

  • 第 2 步:识别要执行的操作。
    现在可以看出 TARGET 和 SOURCE 表之间存在三个不匹配,它们是:
    1. TARGET 中的 COFFEE 成本为 15.00,而 SOURCE 中的成本为 25.00
      PRODUCT_LIST
      102     COFFEE    15.00
      
            UPDATED_LIST
      102     COFFEE    25.00
      
    2. SOURCE 中没有 BISCUIT 产品,但它在 TARGET 中
      PRODUCT_LIST
      103     BISCUIT   20.00
      
    3. TARGET 中没有 CHIPS 产品,但 SOURCE 中有
      UPDATED_LIST
      104     CHIPS     22.00
      

    因此,根据上述差异,需要在TARGET中进行三个操作。他们是:

    1. UDPATE 操作
      102     COFFEE    25.00
      
    2. 删除操作
      103     BISCUIT   20.00
      
    3. 插入操作
      104     CHIPS     22.00
      
  • 第 3 步:编写 SQL 查询。

    MERGE 语句的帮助下执行上述操作的 SQL 查询是:

    /* Selecting the Target and the Source */
    MERGE PRODUCT_LIST AS TARGET
        USING UPDATE_LIST AS SOURCE 
      
        /* 1. Performing the UPDATE operation */
      
        /* If the P_ID is same, 
           check for change in P_NAME or P_PRICE */
        ON (TARGET.P_ID = SOURCE.P_ID)
        WHEN MATCHED 
             AND TARGET.P_NAME <> SOURCE.P_NAME 
             OR TARGET.P_PRICE <> SOURCE.P_PRICE
      
        /* Update the records in TARGET */
        THEN UPDATE 
             SET TARGET.P_NAME = SOURCE.P_NAME,
             TARGET.P_PRICE = SOURCE.P_PRICE
           
        /* 2. Performing the INSERT operation */
      
        /* When no records are matched with TARGET table 
           Then insert the records in the target table */
        WHEN NOT MATCHED BY TARGET 
        THEN INSERT (P_ID, P_NAME, P_PRICE)          
             VALUES (SOURCE.P_ID, SOURCE.P_NAME, SOURCE.P_PRICE)
      
        /* 3. Performing the DELETE operation */
      
        /* When no records are matched with SOURCE table 
           Then delete the records from the target table */
        WHEN NOT MATCHED BY SOURCE 
        THEN DELETE
      
    /* END OF MERGE */
    

    输出:

    PRODUCT_LIST
    P_ID    P_NAME    P_PRICE
    101     TEA       10.00 
    102     COFFEE    25.00
    104     CHIPS     22.00

    因此,通过这种方式,我们可以在 MERGE 语句的帮助下在 SQL 中执行所有这三个主要语句。

    注意:在 MERGE 语法中可以使用除目标和源之外的任何名称。它们仅用于为您提供更好的解释。