2010-12-03 4 views
1

Я хочу переместить некоторые данные из одной таблицы в другую. Я написал запрос, который, как я думаю, будет работать, но в таблице назначения есть столбец, содержащий идентификатор. Я хочу, чтобы каждая строка, которую я вставлял, имела другой и последовательный идентификатор. Вот simplificated пример:Oracle множественные вставки, разные идентификаторы

Table1 
Name Telephone Actie 
Peter 123456 Y 
Michael 111111 Y 
George 1234445 N 

Table2 
Id Name Likes 
1 Peter Books 
2 Michael Books 

Запрос я писал:

insert all into table2 (name, likes) 
select all.name name, 'Books' likes, from (select o.name 
    from table1 o where o.active='Y') all; 

Есть ли какой-либо способ генерации последовательных идентификаторов и использовать «вставить все в» запросе? Последовательность? Если это можно сделать с помощью последовательности ... есть ли способ сделать это без последовательности?

Спасибо и приветствую!

ответ

2

Правильный путь для генерации id в Oracle используется последовательность.

create sequence seq_table2_id nocache; 

Затем после вставки вызова seq_table2_id.nextval.

insert into table2 (id, name, likes) 
select seq_table2_id.nextval 
,  o.name 
,  'Books' 
from table1 o 
where o.active = 'Y' 

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

+0

Ответ хороший, но я ожидал сделать это без использования какой-либо последовательности, даже зная, что это оптимальное решение. – deb 2010-12-03 10:07:00

2

Вы можете использовать ROWNUM:

insert into table2 (id, name, likes) 
select ROWNUM, all.name name, 'Books' likes from (select o.name 
    from table1 o where o.active='Y') all; 

Я не знаю, почему у вас есть подзапрос Вы могли бы написать (возможно, ваш реальный запрос является более сложным?):

insert into table2 (id, name, likes) 
select ROWNUM, o.name, 'Books' likes 
    from table1 o where o.active='Y'; 
+0

Да, как вы сказали, мой запрос более сложный ... может быть, пример, который я поставил, не самый лучший. Я переписал свой запрос с помощью ROWNUM, и он работает так, как я хотел! Спасибо за ваш ответ. – deb 2010-12-03 10:04:23

Смежные вопросы