【问题标题】:Using SQL Merge or UPDATE / INSERT使用 SQL 合并或 UPDATE / INSERT
【发布时间】:2013-04-14 21:40:23
【问题描述】:

我有一个表 (Customer_Master_File),需要从转储到文件夹中的平面文件中进行更新。我有一个 SSIS 包,可以运行以获取平面文件并将它们导入临时表 (temp_Customer_Master_File)

我无法做到的是:

对于临时表中的每条记录,如果主表中存在Customer_Number,则更新它,如果不插入临时表的内容。

我正在更新记录的所有字段,而不是查找单个字段的更改。

我尝试了 SQL Merge 功能,但是当源数据中有多个记录时它会出错。

平面文件包含对客户记录的更改,一次可能有多个更改。我只想根据需要通过插入或更新来处理每条记录。

我还尝试执行 INSERT INTO MASTER_FILE FROM TEMP_TABLE WHERE CUSTOMER_NUMBER NOT IN MASTER_FILE,但这在遇到重复的源行时也会失败并出现 PK 错误。

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:
    UPDATE m SET 
      col2 = t.col2, 
      col3 = t.col3 -- etc. - all columns except Customer_Number
    FROM dbo.Master_File AS m
    INNER JOIN 
    (
      SELECT 
        Customer_Number, rn = ROW_NUMBER() OVER
        (
          PARTITION BY Customer_Number ORDER BY [timestamp_column] DESC
        ), col2, col3, ... etc ...
      FROM dbo.Temp_Table
    ) AS t
    ON m.Customer_Number = t.Customer_Number
    WHERE t.rn = 1;
    
    INSERT dbo.Master_File(Customer_Number, col2, col3, ...etc...)
      SELECT Customer_Number, col2, col3, ...etc...
      FROM 
      (
        SELECT 
          Customer_Number, rn = ROW_NUMBER() OVER 
          (
            PARTITION BY Customer_Number ORDER BY [timestamp_column DESC
          ),
          col2, col3, ...etc...
        FROM dbo.Temp_Table AS t 
        WHERE NOT EXISTS 
        (
          SELECT 1 FROM dbo.Master_File AS m
          WHERE m.Customer_Number = t.Customer_Number
        )
      ) AS x WHERE rn = 1;
    

    这会处理源表中不存在于目标表中的多行。我对列名做了一个假设,您必须对其进行调整。

    MERGE 可能很诱人,但有几个原因我会回避它:

    1. 语法令人生畏且难以记忆...
    2. you don't get any more concurrency than the above approach unless you intentionally add specific locking hints...
    3. there are many unresolved bugs with MERGE 可能还有更多尚未被发现的东西......

    I recently published a cautionary tip here as wellhave collected some other opinions here

    【讨论】:

    • 感谢您,更新工作完美,插入因重复行而失败。我使用哪条记录来插入并不重要,temp_table 中有一个时间戳列,所以最近的记录可以工作。
    • 感谢时间戳列的更新,我还没有尝试过,但看起来它会起作用。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2013-04-26
    • 2012-07-18
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多