MERGE DELETE только на основе родительского идентификатора - PullRequest
1 голос
/ 20 марта 2019

У меня есть таблица с именем Availability, которая выглядит следующим образом.

| Id | Allocated | AverageCost | Demand | InStock | SourceDate | LocationId | ItemId

Теперь ItemId - это связь с таблицей Предметов, а LocationId - это связь с таблицей Местоположения, для каждого элемента может быть только 1 запись на местоположение.

У меня есть другая таблица с обновленной доступностью, но только для некоторых элементов, а не для всех, теперь я хочу объединить и вставить все, что отсутствует в цели, и обновить цель также, но моя проблема в том, что я делаю, когда, скажем, некоторые местоположения из определенных элементов были удалены, я хочу удалить, когда в источнике отсутствует ТОЛЬКО доступность для элементов, которые я сейчас сопоставляю,

вот пример. скажем, в источнике у меня есть несколько записей для ItemId 2356, теперь я хочу сопоставить их с целью только для записей, которые имеют itemId = 2356. поэтому, когда у меня в целевой записи 6 для ItemId 2356 и в источнике, у меня есть только 4 записи для этого ItemId я хочу, чтобы он удалил 2 записи из цели, которые отсутствуют в Source.

Target

ID  A   AC     D   IS    Date      LocationId    ItemID
1 | 0 | 2.36 | 23 | 56 | 3/23/18 | 5689       | 2356 
2 | 0 | 5.36 | 10 | 34 | 3/23/18 | 5634       | 2356 
3 | 0 | 5.36 | 10 | 34 | 3/23/18 | 5756       | 1497
4 | 0 | 5.36 | 10 | 34 | 3/23/18 | 5371       | 2356 
5 | 0 | 5.36 | 10 | 34 | 3/23/18 | 2873       | 2356
6 | 0 | 5.36 | 10 | 34 | 3/23/18 | 8549       | 2356
7 | 0 | 5.36 | 10 | 34 | 3/23/18 | 8549       | 3585
8 | 0 | 5.36 | 10 | 34 | 3/23/18 | 8549       | 2943
9 | 0 | 5.36 | 10 | 34 | 3/23/18 | 2958       | 2356

Источник

 A   AC     D   IS    Date      LocationId    ItemID
 0 | 2.36 | 23 | 56 | 3/23/18 | 5689       | 2356 
 0 | 5.36 | 10 | 34 | 3/23/18 | 5634       | 2356 
 0 | 5.36 | 10 | 34 | 3/23/18 | 2873       | 2356
 0 | 5.36 | 10 | 34 | 3/23/18 | 8549       | 2356

но, к сожалению, мой текущий MERGE удаляет из цели все, что не найдено в источнике, включая записи с другим ItemId.

вот мое слияние.

MERGE Availability AS target
USING #tmpAvailability AS SOURCE 
ON target.[locationId] = SOURCE.[locationId]
  AND target.[ItemId] = Source.[ItemId]   


WHEN MATCHED THEN 

UPDATE SET TARGET.[Allocated] = source.[Allocated],  
           TARGET.[AverageCost] =  source.[AverageCost],
           TARGET.[Demand] =  source.[Demand],
           TARGET.[InStock] =  source.[InStock],
           TARGET.[SourceDate] =  source.[SourceDate]


WHEN NOT MATCHED BY TARGET THEN  

INSERT ([Allocated],[AverageCost],[Demand],[InStock],[SourceDate],[LocationId],[ItemId])          
VALUES (SOURCE.[Allocated] ,SOURCE.[AverageCost],source.[Demand],source.[InStock],source.[SourceDate],source.[LocationId],source.[ItemId])


when Not Matched By Source and source.[ItemId] is not null then
DELETE; 

1 Ответ

1 голос
/ 20 марта 2019

Пожалуйста, попробуйте это:

;WITH MergeTable AS (
    SELECT a.[Allocated],a.[AverageCost],a.[Demand],a.[InStock],a.[SourceDate],a.[LocationId],a.[ItemId]
    FROM Availability a
    WHERE a.ItemID IN (SELECT DISTINCT ItemID FROM #tmpAvailability)
)
MERGE MergeTable AS target
USING #tmpAvailability AS SOURCE 
    ON target.[locationId] = SOURCE.[locationId]
        AND target.[ItemId] = Source.[ItemId]   
WHEN MATCHED THEN 
UPDATE SET TARGET.[Allocated] = source.[Allocated],  
           TARGET.[AverageCost] =  source.[AverageCost],
           TARGET.[Demand] =  source.[Demand],
           TARGET.[InStock] =  source.[InStock],
           TARGET.[SourceDate] =  source.[SourceDate]

WHEN NOT MATCHED BY TARGET THEN  
INSERT ([Allocated],[AverageCost],[Demand],[InStock],[SourceDate],[LocationId],[ItemId])          
VALUES (SOURCE.[Allocated] ,SOURCE.[AverageCost],source.[Demand],source.[InStock],source.[SourceDate],source.[LocationId],source.[ItemId])

WHEN NOT MATCHED BY SOURCE AND source.[ItemId] IS NOT NULL THEN
DELETE; 
...