更新并插入TSQL

时间:2016-07-15 21:35:12

标签: sql sql-server sql-server-2008 tsql

如何修改下面的TSQL更新语句以插入源表的partid不在项目ID =' 500224'的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并不存在于目标表中,我想添加它并保持所有其他内容相同。

4 个答案:

答案 0 :(得分:0)

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

您需要使用IN运算符:

SELECT partId FROM Source WHERE partID NOT IN (SELECT partID FROM Destination)

这将为您提供未在Destination表中显示的所有partID的列表,您可以根据需要将此查询集成到UPDATE或INSERT查询中。

答案 1 :(得分:0)

IF EXISTS(SELECT * FROM destinationTable WHERE partID ='SomeValue')
更新目的地表
SET(..)  在哪里Column1 ='SomeValue'
ELSE
    INSERT INTO destinationTable
价值观(......)

答案 2 :(得分:0)

您可以使用LEFT JOIN进行NULL检查,将丢失的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

中添加了正确的列名

答案 3 :(得分:-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)