В Oracle PL / SQL могу ли я поменять местами значение одного и того же столбца из двух разных строк в таблице, когда остальные значения столбцов равны?

#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’, чтобы ограничить, какие строки могут быть затронуты? Заранее спасибо