更新和插入 TSQL

3
如何修改以下 TSQL 更新语句,以便在目标表中的 Item ID='500224' 的 partid 字段中不存在源表的 partid 时插入它。如果不存在,则需要插入。partid
USE [DBNAME];
GO
    UPDATE m
    SET [partId] = a.[partId] 
select * FROM
    [SourceTable] m
    INNER JOIN 
    [DestTable] a
    ON m.[bomItem] = a.[ItemId]
    AND m.bomEntry = a.bomEntry AND  m.bomRev = a.rev  WHERE
    m.bomRev=a.rev AND m.partId <> a.partid AND m.lineNbr = a.bomEntry ;
  Go

在源表中:

enter image description here

在目标表中:

enter image description here

例如,在上述图片中,partid为100280的部分在目标表中不存在,我想要添加该部分并保持其他所有内容不变。

2
你不能使用单个查询来完成这个操作。从SQL Server 2008R2开始,有一个可以完成此操作的MERGE语句。 - Hamlet Hakobyan
附言:答案和评论提供了实现所需目标的各种方法。无论您选择哪种方法,都要去学习“事务”和“隔离级别”。您需要确保整个操作是原子性的,并且没有引入“竞态条件”。您可以从这里开始(http://weblogs.sqlteam.com/dang/archive/2007/10/28/Conditional-INSERTUPDATE-Race-Condition.aspx)。 (请注意,如果没有适当的锁定,“MERGE”不是原子性的。请参见此处(http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx)。) - HABO
4个回答

0

如果存在(SELECT * FROM destinationTable WHERE partID='SomeValue')
更新destinationTable
SET(..) WHERE Column1 ='SomeValue'
否则
插入到destinationTable中
VALUES(...)


0

https://msdn.microsoft.com/en-us/library/ms177682.aspx

你需要使用IN运算符:
SELECT partId FROM Source WHERE partID NOT IN (SELECT partID FROM Destination)

此操作会返回在目标表中不存在的所有partID列表,您可以将此查询集成到UPDATE或INSERT查询中,根据需要进行修改。


0

您可以使用 LEFT JOINNULL 检查,将缺失的 partid 插入目标表中。

INSERT INTO [DestTable] (bomItem, bomRev, bomEnty, lineNbr, dType, partId, revId, qty)
SELECT ST.ItemID, ST.rev, ST.bomEnty, ST.lineNbr, 0 AS dType, ST.partid, NULL AS revId, ST.qty
FROM [SourceTable] ST
LEFT JOIN [DestTable] DT ON DT.bomItem = ST.ItemID AND DT.partid = ST.partid
        AND DT.bomRev = ST.Rev AND DT.bomEntry = ST.bomEntry -- remove these conditions if not need
WHERE DT.partid IS NULL

由于两个表之间的某些列不匹配,我已在 SELECT 中添加了适当的列名。


1
如何将更新语句与捕获重复数据相结合,以便获取类似于Msg 2627, Level 14, State 1, Line 21 Violation of PRIMARY KEY constraint 'PK_MIBOMD_KEY_0'. Cannot insert duplicate key in object 的信息。 - user6305775

-1
Insert into destTab(bomItem, bomRev, bomEntry, partId, qty)
Select Itemid, rev, bomEntry,partid, qty 
from sourceTab as s 
where not exists (select 1 from destTab as d where d.bomItem=s.Itemid and d.partId=s.partId)

你需要正确地格式化你的代码;你发布的内容无法阅读。 - David Makogon
你应该为未来的读者留下一种注释。仅有代码的答案(即使它是正确的)可能毫无意义。即使是 E = mc<sup>2</sup> 也是如此。 - Alex Kudryashev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接