2016-07-15 121 views
3

如何修改下面的TSQL更新語句以插入源表的partid不在目標表中的項目ID ='500224'的partid字段中。如果不存在,我需要插入。更新並插入TSQL

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語句可以執行thrick。 –

+0

另外:答案和評論提供了各種方法來實現你想要的結果。無論您選擇什麼,請去研究_transactions_和_isolation levels_。您需要確保整個操作以原子方式進行,並且您沒有引入_race condition_。您可以從[這裏]開始(http://weblogs.sqlteam.com/dang/archive/2007/10/28/Conditional-INSERTUPDATE-Race-Condition.aspx)。 (請注意,如果沒有適當的鎖定,MERGE不是原子的,請參見[here](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) ) – HABO

回答

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

我怎麼可以與更新聲明和捕獲重複結合我得到像'2627,級別14,狀態1,行21 違反PRIMARY KEY約束'PK_MIBOMD_KEY_0'。無法在對象中插入重複鍵 – user6305775

0

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

你要使用IN操作符:

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

這會給你沒有出現在目標表中的所有partIDs的列表,你可以整合這個查詢如你所願,進入UPDATE或INSERT查詢。

-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) 
+0

您需要正確格式化您的代碼;你發佈的內容是不可讀的。 –

+0

你應該爲未來的讀者留下一種評論。只有代碼答案(即使它是正確的)可能意味着什麼。即使** E = mc **。 –

0

IF EXISTS(SELECT * FROM destinationTable會WHERE PARTID = 'someValue中')
UPDATE destinationTable會
SET(..) WHERE column1的= 'someValue中'
ELSE
INSERT INTO destinationTable會
VALUES (...)