Я пытаюсь создать архив (TGT), который содержит последнюю версию скользящей (SRC) таблицы.SRC может содержать несколько версий и дубликатов, но TGT должен содержать только уникальные, самые последние строки.
Есть 4 столбца - A, B, C и D, которые образуют уникальный ключ, и 5-й столбец, E, который представляетномер версии.
Так что, если я сделаю объединение по следующему:
SRC.A = TGT.A AND SRC.B = TGT.B AND SRC.C = TGT.C AND SRC.D = TGT.D
Должно быть два результата - совпадение или отсутствие совпадения.Тем не менее, у меня есть подусловие, которое я хочу применить, если есть совпадение, поэтому я на самом деле ищу 3 возможных результата:
Соответствие AND SRC.E > TGT.E
=> SRC - этоболее высокая версия, поэтому строка TGT должна быть обновлена
Соответствие AND SRC.E <= TGT.E
=> SRC старше или равно, поэтому ничего не следует делать
Нет соответствия => строка SRC должна быть вставлена в TGT
Проблема, с которой я сталкиваюсь, связана с результатами 2 и 3, поскольку MERGE
допускает только два предложения WHEN MATCHED
, и вв этом случае один должен быть UPDATE
, а другой - DELETE
.Я действительно хочу UPDATE
и "ничего не делать"
Что-то вроде этого:
MERGE
Target AS TGT
USING
Source AS SRC ON SRC.A = TGT.A AND SRC.B = TGT.B AND SRC.C = TGT.C AND SRC.D = TGT.D
WHEN MATCHED AND SRC.E > TGT.E -- SRC is newer, so update TGT
THEN UPDATE SET TGT.E = SRC.E
WHEN MATCHED -- "AND SRC.E <= TGT.E” is implied...
-- SRC is older or equal, so do nothing
WHEN NOT MATCHED BY TARGET -- SRC doesn't exist in TGT, so insert it
THEN INSERT VALUES (SRC.A, SRC.B, SRC.C, SRC.D, SRC.E)
это возможно?Это так же просто, как каким-то образом переставить мое объединение?
Я попытался удалить второе предложение WHEN MATCHED
, но затем выдается предупреждение о дублировании ключа, потому что он пытается вставить более старую запись
I 'использую SQL Server 2016, если это что-то меняет