Есть таблица Т1 со столбцами Ключ и Значение. Комбинация ключа и значения является первичным ключом, и эта комбинация уникальна.
Я написал запрос на обновление, чтобы обновить все эти значения 890 на 123. Но при обновлении он нарушает уникальность. Существует множество таких ценностей, которые необходимо заменить какими-то другими ценностями.
Я попробовал запрос обновления с операторами Case, но он выдает ошибки:
UPDATE T1
SET Value = CASE
WHEN Value = 123 THEN 890
WHEN Value = 450 THEN 222
ELSE Value
END;
Ошибка:
Нарушение ограничения первичного ключа. Невозможно вставить дубликат ключа в объект. Дубликат объекта «ключ-значение»: (xyz, 123).
Кстати, CASE
— это выражение в T-SQL; он возвращает скалярное значение. Если вы попытаетесь использовать его как утверждение (Switch
), это вполне может быть проблемой.
этот материал обычно трудно получить правильно в одном запросе. Скопируйте данные в #t-table, затем выполните обновление, а затем обновите до -1 или любого другого значения, где вы получите дубликаты, и, наконец, обновите основную таблицу из #t-table.
А что насчет ошибки, ты здесь не понимаешь? Похоже, вы пытаетесь создать дубликаты ключей; это не разрешено. Хотя, по правде говоря, я не уверен, как вы получили дублированное состояние, если оно уже не было в вашей таблице. Такое ощущение, что есть нечто большее, о чем вы нам не говорите.
Эта рабочий пример может помочь нам совместно найти решение dbfiddle.uk/3u6jAh2p
--Find duplicates and rows to update
WITH a AS (
SELECT T1.[KEY],
t1.[Value],
CASE t1.[Value]
WHEN 890 THEN 123
WHEN 450 THEN 222
ELSE [Value]
END as NewValue,
CASE t1.[Value]
WHEN 890 THEN 'Update'
WHEN 450 THEN 'Update'
ELSE 'No Change'
END as Action
FROM T1
)
SELECT t1.[KEY], STRING_AGG(t1.[VALUE],',') as T1Value, a.NewValue, Count(*) as KeyValueCount,
CASE
WHEN count(*) > 1 THEN 'Duplicate'
ELSE
min(a.Action)
END AS Action
INTO #temp
FROM
T1
INNER JOIN a ON a.[Value]=t1.[Value] AND a.[Key]=T1.[Key]
GROUP BY t1.[KEY], a.NewValue;
--Update the table T1
UPDATE T1
SET T1.[Value]=#Temp.[NewValue]
FROM T1
INNER JOIN #Temp on #Temp.[Key]=T1.[Key]
AND #Temp.[T1Value]=T1.[Value]
WHERE
#Temp.Action='Update'
Выявление дубликатов и обновлений:
Обновленная таблица:
Решение снабжено шагами, которые помогут ОП понять процесс. Компактная версия доступна по запросу.
Не могли бы вы предоставить мне компактную версию. Заранее спасибо ! @Барт МакЭндри
Компактный dbfiddle.uk/-FY9pIsD
Покажите нам вашу текущую попытку и сообщение об ошибке.