Sql server 基于列中的值更新SQL Server表

Sql server 基于列中的值更新SQL Server表,sql-server,Sql Server,我的SQL Server数据库中有11个表,其中有相同的列,10个是子表,1个是主表,其中10个表中的数据将被合并。这10个表不断更新,下面是我的11个表的列: [DATE], [SOURCE], [DESTINATION], [REFERENCE#], [ITEMCODE], [DESCRIPTION], [UM], [PRICE], [QTY], [AMOUNT], [MFGDATE], [EXPDATE], [LOT#], [TRANS], [CONSIGNOR], [DRDATE] 当

我的SQL Server数据库中有11个表,其中有相同的列,10个是子表,1个是主表,其中10个表中的数据将被合并。这10个表不断更新,下面是我的11个表的列:

[DATE], [SOURCE], [DESTINATION], [REFERENCE#], [ITEMCODE], [DESCRIPTION],
[UM], [PRICE], [QTY], [AMOUNT], [MFGDATE], [EXPDATE], [LOT#], [TRANS], [CONSIGNOR], [DRDATE]
当用户更新表(即表1)时,应根据源列和目标列自动更新主表。我知道有Merge语句,您可以在其中同时更新、插入和删除所有数据,但我的问题是delete,因为与主表相比,表1只包含部分数据,它将删除主表中不存在于表1中的其余数据


我是SQL Server新手,我自己无法实现这一点,这就是我来这里寻求想法和帮助的原因。

您可以尝试在Table1表上使用after insert触发器:


我假设Table1和主表是通过一个名为Id的列连接的。但是,您可以更新连接逻辑,以使用应确定如何连接这两个表的列。

在阅读了您的评论和建议,以及在其他网站上阅读了更多内容后,我得出了以下结论:

MERGE DelTrans2 as trgt
USING testTable1 src
    ON trgt.SOURCE = Src.SOURCE
    AND trgt.DESTINATION = Src.DESTINATION
    AND trgt.REFERENCE# = Src.REFERENCE#
    AND trgt.ITEMCODE = Src.ITEMCODE
    AND trgt.ID = Src.ID
WHEN NOT MATCHED BY TARGET
    AND Src.ID = 1001 THEN
    INSERT(DATE, SOURCE, DESTINATION, REFERENCE#, ITEMCODE, DESCRIPTION, UM, PRICE, QTY, AMOUNT, MFGDATE, EXPDATE, LOT#, TRANS, CONSIGNOR, DRDATE, ID)
    VALUES(DATE, SOURCE, DESTINATION, REFERENCE#, ITEMCODE, DESCRIPTION, UM, PRICE, QTY, AMOUNT, MFGDATE, EXPDATE, LOT#, TRANS, CONSIGNOR, DRDATE, ID)
WHEN MATCHED AND 
    (
        ISNULL(trgt.DATE, '') <> ISNULL(Src.DATE, '')
        OR
        ISNULL(trgt.SOURCE, '') <> ISNULL(Src.SOURCE, '')
        OR
        ISNULL(trgt.DESTINATION, '') <> ISNULL(Src.DESTINATION, '')
        OR
        ISNULL(trgt.REFERENCE#, '') <> ISNULL(Src.REFERENCE#, '')
        OR
        ISNULL(trgt.ITEMCODE, '') <> ISNULL(Src.ITEMCODE, '')
        OR
        ISNULL(trgt.DESCRIPTION, '') <> ISNULL(Src.DESCRIPTION, '')
        OR
        ISNULL(trgt.UM, '') <> ISNULL(Src.UM, '')
        OR
        ISNULL(trgt.PRICE, '') <> ISNULL(Src.PRICE, '')
        OR
        ISNULL(trgt.QTY, '') <> ISNULL(Src.QTY, '')
        OR
        ISNULL(trgt.AMOUNT, '') <> ISNULL(Src.AMOUNT, '')
        OR
        ISNULL(trgt.MFGDATE, '') <> ISNULL(Src.MFGDATE, '')
        OR
        ISNULL(trgt.EXPDATE, '') <> ISNULL(Src.EXPDATE, '')
        OR
        ISNULL(trgt.LOT#, '') <> ISNULL(Src.LOT#, '')
        OR
        ISNULL(trgt.TRANS, '') <> ISNULL(Src.TRANS, '')
        OR
        ISNULL(trgt.CONSIGNOR, '') <> ISNULL(Src.CONSIGNOR, '')
        OR
        ISNULL(trgt.DRDATE, '') <> ISNULL(Src.DRDATE, '')
        OR
        ISNULL(trgt.ID, '') <> ISNULL(Src.ID, '')
    )
    AND Src.ID = 1001
THEN
    UPDATE SET DATE = Src.DATE, SOURCE = Src.SOURCE, DESTINATION = Src.DESTINATION, REFERENCE# = Src.REFERENCE#, ITEMCODE = Src.ITEMCODE, DESCRIPTION = Src.DESCRIPTION, UM = Src.UM, PRICE = Src.PRICE, QTY = Src.QTY, AMOUNT = Src.AMOUNT, MFGDATE = Src.MFGDATE, EXPDATE = Src.EXPDATE, LOT# = Src.LOT#, TRANS = Src.TRANS, CONSIGNOR = Src.CONSIGNOR, DRDATE = Src.DRDATE, ID = Src.ID
WHEN NOT MATCHED BY SOURCE
    AND trgt.ID = 1001 THEN
    DELETE;
我知道这不是最有效的方法,但这符合我的要求


感谢您的帮助。

您可以轻松设置“合并”以仅更新现有行,而不删除任何内容!为什么是这种设计?我是说,你为什么需要第11张桌子?为什么不使用视图?可能吗?抱歉,我不知道,这就是为什么我要问的,它会在主表中查找源和目标,并在表1中进行比较,然后更新、插入和删除?你可以使用触发器,但我不会使用MERGE as@marc_,因为它有,相反,我会使用exists所有这些表都有相同的列吗?您能否提供DDL和DML创建表和插入语句以及预期结果的示例数据?
MERGE DelTrans2 as trgt
USING testTable1 src
    ON trgt.SOURCE = Src.SOURCE
    AND trgt.DESTINATION = Src.DESTINATION
    AND trgt.REFERENCE# = Src.REFERENCE#
    AND trgt.ITEMCODE = Src.ITEMCODE
    AND trgt.ID = Src.ID
WHEN NOT MATCHED BY TARGET
    AND Src.ID = 1001 THEN
    INSERT(DATE, SOURCE, DESTINATION, REFERENCE#, ITEMCODE, DESCRIPTION, UM, PRICE, QTY, AMOUNT, MFGDATE, EXPDATE, LOT#, TRANS, CONSIGNOR, DRDATE, ID)
    VALUES(DATE, SOURCE, DESTINATION, REFERENCE#, ITEMCODE, DESCRIPTION, UM, PRICE, QTY, AMOUNT, MFGDATE, EXPDATE, LOT#, TRANS, CONSIGNOR, DRDATE, ID)
WHEN MATCHED AND 
    (
        ISNULL(trgt.DATE, '') <> ISNULL(Src.DATE, '')
        OR
        ISNULL(trgt.SOURCE, '') <> ISNULL(Src.SOURCE, '')
        OR
        ISNULL(trgt.DESTINATION, '') <> ISNULL(Src.DESTINATION, '')
        OR
        ISNULL(trgt.REFERENCE#, '') <> ISNULL(Src.REFERENCE#, '')
        OR
        ISNULL(trgt.ITEMCODE, '') <> ISNULL(Src.ITEMCODE, '')
        OR
        ISNULL(trgt.DESCRIPTION, '') <> ISNULL(Src.DESCRIPTION, '')
        OR
        ISNULL(trgt.UM, '') <> ISNULL(Src.UM, '')
        OR
        ISNULL(trgt.PRICE, '') <> ISNULL(Src.PRICE, '')
        OR
        ISNULL(trgt.QTY, '') <> ISNULL(Src.QTY, '')
        OR
        ISNULL(trgt.AMOUNT, '') <> ISNULL(Src.AMOUNT, '')
        OR
        ISNULL(trgt.MFGDATE, '') <> ISNULL(Src.MFGDATE, '')
        OR
        ISNULL(trgt.EXPDATE, '') <> ISNULL(Src.EXPDATE, '')
        OR
        ISNULL(trgt.LOT#, '') <> ISNULL(Src.LOT#, '')
        OR
        ISNULL(trgt.TRANS, '') <> ISNULL(Src.TRANS, '')
        OR
        ISNULL(trgt.CONSIGNOR, '') <> ISNULL(Src.CONSIGNOR, '')
        OR
        ISNULL(trgt.DRDATE, '') <> ISNULL(Src.DRDATE, '')
        OR
        ISNULL(trgt.ID, '') <> ISNULL(Src.ID, '')
    )
    AND Src.ID = 1001
THEN
    UPDATE SET DATE = Src.DATE, SOURCE = Src.SOURCE, DESTINATION = Src.DESTINATION, REFERENCE# = Src.REFERENCE#, ITEMCODE = Src.ITEMCODE, DESCRIPTION = Src.DESCRIPTION, UM = Src.UM, PRICE = Src.PRICE, QTY = Src.QTY, AMOUNT = Src.AMOUNT, MFGDATE = Src.MFGDATE, EXPDATE = Src.EXPDATE, LOT# = Src.LOT#, TRANS = Src.TRANS, CONSIGNOR = Src.CONSIGNOR, DRDATE = Src.DRDATE, ID = Src.ID
WHEN NOT MATCHED BY SOURCE
    AND trgt.ID = 1001 THEN
    DELETE;