MERGE DELETE только на основе родительского идентификатора

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

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

теперь ItemId является отношением к таблице Items, а LocationId — отношением к таблице Location, может быть только 1 запись для каждого местоположения для каждого элемента.

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

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

Цель

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; 

person Sol Stein    schedule 20.03.2019    source источник
comment
Это предложение не имеет смысла: я хочу удалить, когда в источнике отсутствует Доступность ТОЛЬКО для элементов, которые я сейчас сопоставляю. Как источник может одновременно отсутствовать и совпадать? Вам, вероятно, понадобится привести пример, чтобы было понятно.   -  person Tab Alleman    schedule 20.03.2019
comment
@TabAlleman, я обновил свой вопрос, надеюсь, теперь я более конкретен.   -  person Sol Stein    schedule 20.03.2019


Ответы (1)


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

;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; 
person Vitaly Borisov    schedule 20.03.2019
comment
спасибо, работает точно так, как ожидалось, теперь я выполняю отдельный ItemId, как я буду справляться с производительностью, когда источник будет иметь около 120 000 записей, а цель будет иметь 350 000 записей, есть ли лучший способ пойти с этим? что касается производительности, скорости. - person Sol Stein; 20.03.2019
comment
Попробуйте поместить некластеризованный индекс в ItemId временной таблицы. - person Vitaly Borisov; 20.03.2019