Это не просто обновление, это также удаление.
Это означает, что у вас должен быть двухэтапный процесс - один для обновления соответствующих записей, а другой для удаления дубликатов, созданных на первом шаге.
Это можно сделать с помощью пары общих табличных выражений, которые используют оконные функции, такие как count() over()
и row_number() over()
, когда оба шага объединяются внутри транзакции.
Сначала создайте и заполните образец таблицы ( Пожалуйста, сохраните нам этот шаг в своих будущих вопросах):
DECLARE @T AS TABLE
(
RequestNumber int,
TrackName varchar(10),
[Date] datetime2
);
INSERT INTO @T (RequestNumber, TrackName, Date) VALUES
(02209, 'Middle', '2017-05-28 00:00:00'),
(0263, 'Middle', '2017-06-29 00:00:00'),
(0633, 'Middle', '2017-09-10 00:00:00'),
(0762, 'Back', '2017-06-23 00:00:00'),
(0762, 'Front', '2017-06-23 00:00:00'),
(0762, 'Middle', '2017-06-23 00:00:00'),
(01839, 'Middle', '2017-03-09 00:00:00');
Далее запустите блок try
итранзакция:
BEGIN TRY
BEGIN TRANSACTION;
Затем определите и обновите соответствующие записи:
WITH CTE AS
(
SELECT RequestNumber,
TrackName,
Date,
COUNT(TrackName) OVER(PARTITION BY RequestNumber, Date) As Cnt
FROM @T
)
UPDATE CTE
SET TrackName = 'All Three'
WHERE Cnt = 3;
Затем удалите дубликаты:
WITH CTE AS
(
SELECT RequestNumber,
TrackName,
Date,
ROW_NUMBER() OVER(PARTITION BY RequestNumber, Date ORDER BY TrackName) As Rn
FROM @T
)
DELETE
FROM CTE
WHERE Rn > 1;
Подтвердите транзакцию и закройтеtry
block:
COMMIT TRANSACTION;
END TRY
Используйте блок catch для отката транзакции:
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
-- you might want to print the result of ERROR_MESSAGE() here...
END CATCH
И, наконец, выберите, чтобы увидеть изменения:
SELECT RequestNumber,
TrackName,
Date
FROM @T
Результаты:
RequestNumber TrackName Date
2209 Middle 28.05.2017 00:00:00
263 Middle 29.06.2017 00:00:00
633 Middle 10.09.2017 00:00:00
762 All Three 23.06.2017 00:00:00
1839 Middle 09.03.2017 00:00:00
Вы можете увидеть живое демо на rextester (за исключением части транзакции, которая там не разрешена, и попытки ... поймать, которая не актуальна безтранзакция в любом случае)