2009-10-27 7 views
1

У меня две схемы S1 и S2 с одинаковой структурой таблицы. I`ll начать с примера:UPDATE before INSERT (Oracle)

на S1.table1 у меня есть:

 
    ID DATA1  DATA2 
    ---- ---------- ---------- 
    01 data1  test1 
    02 data1  test1 

на S2.table1 у меня есть:

 
    ID DATA1  DATA2 
    ---- ---------- ---------- 
    01 data2  test2 
    02 data2  test2 

Можно выбрать одну строку (из S1 .table1) обновить его (изменить значение столбца ID) и вставить его в S2.table1? Я хочу написать один SQL-запрос, который будет использоваться в качестве подготовленного оператора (Java).

Окончательный результат на S2 должен быть:

 
    ID DATA1  DATA2 
    ---- ---------- ---------- 
    01 data2  test2 
    02 data2  test2 
    03 data1  test1 

так я вставил первую строку из S1.table1, и изменил только идентификатор.

Спасибо, Jonas

ответ

2

Как насчет

INSERT INTO S2 
SELECT 03, DATA1, DATA2 FROM S1 WHERE ID=01 

То есть, вы просто выбрать данные, которые вы хотите, но в явном виде указать любые данные замены.

+0

Спасибо, отличная идея. Но, если я не хочу перечислять все остальные столбцы? 's как: INSERT INTO S2.table1 (SELECT * FROM S1 Где ID = 01) , но я хочу, чтобы изменить столбец ID (не генерироваться автоматически) – negersiu

+0

Да, это жесткая один. У меня также были случаи, когда мне нужна команда SELECT ALLY EXCEPT, но ее нет. Я думаю, вы могли бы просто скопировать всю строку, а затем сразу же сделать обновление. –

1
INSERT INTO S2 (Data1, Data2) SELECT Data1, Data2 FROM S1 WHERE ID=xxx 

Предполагая, что идентификатор в S2 автоинкремлен (например, через последовательность и триггер).

+0

Используйте [имя последовательности] .NEXTVAL - обычно нет необходимости делать это в триггере. –

+0

Правда, но триггер имеет то преимущество, что не требует использования правильной последовательности. Наверное, это вопрос вкуса. – Lucero

+0

В столбце ID не автоинкремент, я использовал очень упрощенный пример: таблица фактически содержит около 50 столбцов, а ключевой столбец (уникальное ограничение) не является автоматически сгенерированным значением. – negersiu

1

Вы должны использовать последовательность:

insert into s2.table1 
select seq.next_val, data1, data2 
from s1.table1 

последовательность всегда будет подсчитывать. Поэтому, когда вы запустите это снова, новые строки будут добавлены к существующим.

0
insert into s2.table1 (
    select id+1, data1, data2 
    from s1.table1 
    where id=(select max(id) from s1.table1) 
); 
Смежные вопросы