我需要MERGE
一組記錄到表中。源中的UpdateType
列確定目標中是否應該有DELETE
行不在源中。如何才能「全部刪除」,但只有當某列具有特定值時纔可以?
所以UpdateType
將等於D
或R
... d =三角洲,R =刷新
如果D
,不DELETE
從目標
如果R
不匹配,從目標DO DELETE
不匹配。
我有一個WHILE
遍歷單個表,以更好地模仿過程如何工作。
我可以在MERGE中完成這項工作嗎?或者我有什麼其他選擇?
SQL小提琴:http://www.sqlfiddle.com/#!3/9cdfe/16
這裏是我的例子中,唯一的問題是......我不能WHEN NOT MATCHED BY SOURCE
子句中使用的輸出電流值。
DECLARE @BaseTable TABLE
( RN int
,Store int
,UpdateType char(1)
,ItemNumber int
,Name varchar(50)
)
INSERT INTO @BaseTable
SELECT *
FROM
(
SELECT 1 RN, 1 Store, 'D' UpdateType, 1 ItemNumber, 'Wheel' Name
UNION ALL
SELECT 2, 1, 'D', 1, 'Big Wheel'
UNION ALL
SELECT 3, 1, 'D', 2, 'Light'
UNION ALL
SELECT 4, 1, 'R', 1, 'Wide Wheel'
UNION ALL
SELECT 5, 1, 'D', 1, 'Small Wheel'
UNION ALL
SELECT 5, 1, 'D', 4, 'Trunk'
)B
SELECT bt.* FROM @BaseTable bt
DECLARE @Tab TABLE
( Store int
,UpdateType char(1)
,ItemNumber int
,Name varchar(50)
)
DECLARE @count int = 1
--Loop over each row to mimic how the merge will be called.
WHILE @count <= 5
BEGIN
MERGE INTO @Tab T
USING
(
SELECT bt.RN,
bt.Store,
bt.UpdateType,
bt.ItemNumber,
bt.Name,
tab.Store IsRefresh
FROM @BaseTable bt
LEFT JOIN
( --If ANY previous ITERATION was a 'R' then, all subsequent UpdateType MUST = 'R'
--I'm hoping there is a better way to accomplish this.
SELECT Store
FROM @Tab
WHERE UpdateType = 'R'
GROUP BY Store
HAVING COUNT(Store) > 1
)tab
ON bt.Store = tab.Store
WHERE bt.RN = @count
)S
ON S.Store = T.Store AND S.ItemNumber = T.ItemNumber
WHEN MATCHED THEN
UPDATE
SET T.UpdateType = CASE WHEN S.IsRefresh IS NOT NULL THEN 'R' ELSE S.UpdateType END,
T.Name = S.Name
WHEN NOT MATCHED BY TARGET THEN
INSERT(Store,UpdateType,ItemNumber,Name) VALUES(S.Store,S.UpdateType,S.ItemNumber,S.Name)
--WHEN NOT MATCHED BY SOURCE AND S.UpdateType = 'R' THEN
-- DELETE
;
SET @count = @count + 1
END
SELECT * FROM @Tab
[email protected] Expected Result:
-- 1 'R' 1 'Small Wheel'
-- 1 'R' 4 'Trunk'
對不起,我不完全理解你的輸出。那裏爲什麼沒有'ItemNumber = 2'? – Lamak
因爲當它迭代到'RN = 4'時,'UpdateType ='R'將會「刪除@ tab中所有不匹配的內容」。由於'RN = 4',沒有'ItemNumber = 2'的記錄,這將被刪除,只有'ItemNumber = 1'將被更新。 'RN = 5'將更新'ItemNumber = 1'並插入'ItemNumber = 4'。這些幫助有用? – MisterIsaak