Таблицы слияния Oracle SQL без указания столбцов

У меня есть таблица people с менее чем 100 000 записей, и я сделал резервную копию этой таблицы, используя следующее:

create table people_backup as select * from people 

Со временем я добавляю несколько новых записей в свою таблицу people, но в конечном итоге я хочу объединить записи из моей резервной таблицы в people. К сожалению, я не могу просто DROP мою таблицу, так как мои новые записи будут потеряны!

Итак, я хочу обновить записи в моей таблице people, используя записи из people_backup на основе их первичного ключа id, и я нашел 2 способа сделать это:

  1. ОБЪЕДИНИТЕ таблицы вместе
  2. используйте какое-то причудливое коррелированное обновление

Здорово! Однако оба этих метода используют SET и заставляют меня указывать, какие столбцы я хочу обновить. К сожалению, я ленив, и структура people может меняться со временем, и хотя мой оператор CTAS не нуждается в обновлении, мой сценарий обновления/слияния потребует изменений, что кажется мне ненужной работой.

Есть ли способ объединить целые строки без указания столбцов? Я вижу здесь, что отсутствие указания столбцов во время INSERT направит SQL к вставляйте значения по порядку, можно ли применить ту же методологию здесь, безопасно ли это?

NB: структура таблицы не изменится между резервными копиями.


person Rossiar    schedule 04.11.2015    source источник
comment
Всегда нужно указывать, какие столбцы будут обновляться. Вот как это работает. Однако вы можете написать сценарий для написания сценария - например. select 'set tgt.'||column_name||' = src.'||colunn_name||',' from user_tab_columns where table_name = 'TABLE_NAME';, который, по крайней мере, сможет сгенерировать для вас список столбцов, чтобы вы могли скопировать и вставить его в свою выписку.   -  person Boneist    schedule 04.11.2015
comment
Учитывая, что ваша таблица маленькая, не могли бы вы просто delete что-нибудь из таблицы, которая существует в резервной копии, а затем сделать insert всего в резервной копии? Это медленно и не особенно элегантно, но соответствует вашим требованиям.   -  person Justin Cave    schedule 04.11.2015
comment
Вы хотите заменить новые данные старыми?   -  person Dan Bracuk    schedule 04.11.2015
comment
@JustinCave, если бы вы могли опубликовать ответ, я приму   -  person Rossiar    schedule 06.11.2015


Ответы (1)


Учитывая, что ваш стол небольшой, вы можете просто

DELETE FROM table t
 WHERE EXISTS( SELECT 1
                 FROM backup b
                WHERE t.key = b.key );

INSERT INTO table
  SELECT *
    FROM backup;

Это медленно и не особенно элегантно (особенно если большая часть данных из резервной копии не изменилась), но при условии, что столбцы в двух таблицах совпадают, это позволяет вам не перечислять столбцы. Лично я бы предпочел написать имена столбцов (предположительно, они не меняются так часто), чтобы я мог сделать обновление.

person Justin Cave    schedule 06.11.2015