【问题标题】:SQL Server update multiple columns and add missing rows based on a key from two tablesSQL Server 根据两个表中的键更新多个列并添加缺失的行
【发布时间】:2016-07-08 14:09:25
【问题描述】:

我想在 SQL Server 中根据一个通用的非数字列键 [Key] 更新源表 B 中的目标表 A 中的多个列 [C1]、[C2] 并添加缺失的行(包括键) 在目标表 A 中。表 A 和 B 具有完全相同的列,包括键。约束是永远不要从 A 中删除任何记录。我不介意数据是否不真实,但我确实介意数据是否丢失。所以我相信没有 DROP 没有截断。最有效的方法是什么?

示例表

    Destination Table A with columns:
[Key][C1][C2]
    A, 1, 2
    B, 3, 4
    C, 5, 6

    SourceTable B with columns:
[Key][C1][C2]
    A, 2, 1
    B, 3, 4
    C, 7, 6
    D, 0, 0

预期结果 A 与 B 完全相同

    Destination Table A:
[Key][C1][C2]
    A, 2, 1
    B, 3, 4
    C, 7, 6
    D, 0, 0

编辑:我忘了提到,如果稍后从表 B 中删除某些内容,例如带有键 A 的行,则在更新时它也应该从表 A 中删除。

【问题讨论】:

    标签: sql sql-server insert sql-update


    【解决方案1】:

    看看这个关键字: https://msdn.microsoft.com/en-us/library/bb510625.aspx

    这就是解决方案:

       ;MERGE INTO [Table_A] AS Target  
        USING (SELECT [B1],[B2],[B3] FROM [Table_B])
               AS Source ([B1],[B2],[B3])  
        ON Target.[A1] = Source.[B1]  
        WHEN MATCHED THEN  
        UPDATE 
        SET [A2] = Source.[B2],
            [A3] = Source.[B3]  
        WHEN NOT MATCHED BY TARGET THEN  
        INSERT ([A1],[A2],[A3]) VALUES ([B1],[B2],[B3]);
    

    以及删除表 A 中多余键的代码:

    ;WITH IdsToDelete ([A1]) AS
    (
        SELECT DISTINCT [A1]
        FROM [Table_A]
        WHERE [A1] NOT IN (SELECT [B1] FROM [Table_B])
    
    )
    DELETE t1 
    FROM [Table_A] t1 
        JOIN IdsToDelete itd ON t1.[A1] = itd.[A1]
    

    【讨论】:

    • 谢谢!但是,删除某些内容后它会起作用吗?例如,当从表 B 中删除某些内容时,它也应该从表 A 中删除。
    • 不行,我想你必须再做一次治疗。
    • 我虽然如此。此查询还为我更新了所有行,而不仅仅是更改的行
    • 只是为了记录我最终所做的而不是更新记录是在一个事务中截断表并再次插入所有值。这不是我想要的,但它似乎是更简单的方法。
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多