Обновить столбец и мгновенно использовать результат для обновления второго столбца в пределах одного оператора - PullRequest
0 голосов
/ 16 января 2020

В Oracle SQL (версия 12 c) есть ли способ выполнить обновление для нескольких столбцов, ссылающихся друг на друга? Предполагая, что у меня есть следующая таблица с именем test_tb :

|pk  |col1|col2|
----------------
|1   |4   |1   |
|2   |9   |2   |
|3   |7   |9   |

Я намереваюсь добиться следующего результата:

|pk  |col1|col2|
----------------
|1   |5   |6   |
|2   |10  |12  |
|3   |8   |17  |

Первой настройкой

col1 = col1 + 1

, за которым следует

col2 = col2 + col1

Насколько я знаю, я могу сделать это:

update test_tb set col1 = col1 + 1, col2 = col2 + col1 + 1

Однако, при выполнении более сложных операций это станет большим обслуживанием. Другой вариант:

merge into test_tb desc
using (
  with tmp as (
    select pk,
      col1 + 1 as col1,
      col2
    from test_tb
  )
  select pk,
    col1,
    col2 + col1 as col2
) src
on (dest.pk = src.pk)
when matched then update set
  dest.col1 = src.col1,
  dest.col2 = src.col1;

При большом количестве данных (в моей таблице ~ 10 млн. Строк) это не является оптимальным вариантом.

Есть ли способ избежать напишите код, в результате которого дважды появится «col1» и в то же время получите хорошую производительность?

1 Ответ

2 голосов
/ 16 января 2020

Вы могли бы обновить встроенное представление, возможно? Например:

update (select pk,
               col1,
               col2,
               col1 + 1 col1_new
        from   your_table)
set col1 = col1_new,
    col2 = col2 + col1_new;

Полный тестовый набор

...