Обновить запрос с помощью операторов Case

Есть таблица Т1 со столбцами Ключ и Значение. Комбинация ключа и значения является первичным ключом, и эта комбинация уникальна.

Ключ Ценить xyz 123 xyz 456 xyz 890 абв 123 абв 135 абв 204 я мн 890 привет 890

Я написал запрос на обновление, чтобы обновить все эти значения 890 на 123. Но при обновлении он нарушает уникальность. Существует множество таких ценностей, которые необходимо заменить какими-то другими ценностями.

Я попробовал запрос обновления с операторами Case, но он выдает ошибки:

UPDATE T1
SET Value = CASE 
                WHEN Value = 123 THEN 890
                WHEN Value = 450 THEN 222
                ELSE Value
            END;

Ошибка:

Нарушение ограничения первичного ключа. Невозможно вставить дубликат ключа в объект. Дубликат объекта «ключ-значение»: (xyz, 123).

Покажите нам вашу текущую попытку и сообщение об ошибке.

jarlh 15.04.2024 16:40

Кстати, CASE — это выражение в T-SQL; он возвращает скалярное значение. Если вы попытаетесь использовать его как утверждение (Switch), это вполне может быть проблемой.

Thom A 15.04.2024 17:00

этот материал обычно трудно получить правильно в одном запросе. Скопируйте данные в #t-table, затем выполните обновление, а затем обновите до -1 или любого другого значения, где вы получите дубликаты, и, наконец, обновите основную таблицу из #t-table.

siggemannen 15.04.2024 17:19

А что насчет ошибки, ты здесь не понимаешь? Похоже, вы пытаетесь создать дубликаты ключей; это не разрешено. Хотя, по правде говоря, я не уверен, как вы получили дублированное состояние, если оно уже не было в вашей таблице. Такое ощущение, что есть нечто большее, о чем вы нам не говорите.

Thom A 15.04.2024 17:23

Эта рабочий пример может помочь нам совместно найти решение dbfiddle.uk/3u6jAh2p

Bart McEndree 15.04.2024 19:51
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
--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'

рабочий пример

Выявление дубликатов и обновлений:

КЛЮЧ T1Значение Новое значение KeyValueCount Действие абв 123 123 1 Без изменений привет 890 123 1 Обновлять я мн 890 123 1 Обновлять xyz 890 123 123 2 Дублировать вабк 135 135 1 Без изменений абв 204 204 1 Без изменений xyz 456 456 1 Без изменений

Обновленная таблица:

Ключ Ценить xyz 123 xyz 456 xyz 890 абв 123 вабк 135 абв 204 я мн 123 привет 123

Решение снабжено шагами, которые помогут ОП понять процесс. Компактная версия доступна по запросу.

Bart McEndree 15.04.2024 20:20

Не могли бы вы предоставить мне компактную версию. Заранее спасибо ! @Барт МакЭндри

Sandeep Manchukonda 16.04.2024 13:22

Компактный dbfiddle.uk/-FY9pIsD

Bart McEndree 16.04.2024 13:50

Другие вопросы по теме