#sql #oracle #sql-update
#sql #Oracle #sql-update
Вопрос:
В основном я ошибся при присвоении значений некоторым строкам. Две строки имеют одинаковые значения во всех столбцах, кроме одного, и в этом столбце значения должны быть заменены. Как я могу подойти к проблеме?
Я уже пробовал использовать некоторый код, но это работает только тогда, когда одно из других значений отличается, чтобы использовать его в качестве ссылки. Но когда все остальные значения одинаковы, это не сработает.
В столбце ‘bar’ я просто хотел бы поменять местами значения из обеих строк.
foo bar foo2
1 2 4
1 3 4
Комментарии:
1. Если все остальные значения одинаковы, в чем проблема? Здесь у вас есть одна строка со значением (1, 2, 4), а другая со значениями (1, 3, 4). Даже если вы сделаете замену 2 и 3 между строками, у вас все равно останутся две строки со значениями (1, 2, 4) и (1, 3, 4). Другими словами, разницы нет. Возможно, более по существу — каков первичный ключ в этой таблице? Если PK=(foo, bar, foo2), то вам не следует изменять значение bar, потому что первичный ключ 1. Никогда не равен НУЛЮ, 2. Уникален и 3. Неизменен. Многие люди забывают или удобно игнорируют последнее ограничение, но — что ж, вот и вы.
2. Проблема в том, могу ли я поменять местами значения, это просто пример, могут быть некоторые другие столбцы с разными значениями
Ответ №1:
Вы можете сделать это с помощью инструкции CASE:
update the_table
set the_column = case pk_column
when 1 then (select the_column from the_table where pk_column = 2)
when 2 then (select the_column from the_table where pk_column = 1)
end
where pk_column in (1,2);
Выше предполагается, что pk_column
определено как уникальное.
Комментарии:
1. Могу ли я просто добавить после оператора where предложение ‘and’, чтобы ограничить, какие строки могут быть затронуты? Заранее спасибо