2010-12-03 18 views
1

Je souhaite déplacer certaines données d'une table à une autre. J'ai écrit une requête qui fonctionnera, mais dans la table de destination, il y a une colonne qui contient un identifiant. Je veux que chaque ligne que j'insère ait un identifiant différent et consécutif. Voici un exemple simplificated:Insertions multiples Oracle, ID différents

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

Table2 
Id Name Likes 
1 Peter Books 
2 Michael Books 

La requête que j'ai écrit:

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

Est-il possible de générer les ids consécutifs et utiliser le « insérer tout dans » la requête? Une séquence? Si cela peut être fait avec une séquence ... est-il possible de le faire sans séquence?

Merci pour votre intérêt!

Répondre

2

La bonne façon pour générer des ID dans Oracle est en utilisant une séquence.

create sequence seq_table2_id nocache; 

Puis lors de l'insertion de l'appel 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' 

Personnellement, j'utiliser un déclencheur pour appeler automatiquement la séquence sur des inserts, mais il y a des gens qui détestent l'aide de déclencheurs.

+0

La réponse est bonne, mais je m'attendais à le faire sans l'utilisation d'une séquence, même en sachant que c'est la solution optimale. – deb

+0

Il n'y a pas de raison de créer une séquence pour une insertion unique à une seule session. ROWNUM est parfaitement "propre" dans ce scénario. –

2

Vous pouvez utiliser 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; 

Je ne sais pas pourquoi vous avez la sous-requête Vous pouvez écrire (peut-être votre requête réelle est plus complexe?):

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

Oui, comme vous l'avez dit, ma requête est plus complexe en effet ... peut-être que l'exemple que j'ai mis n'est pas le meilleur. J'ai réécrit ma requête en utilisant ROWNUM et ça marche comme je le voulais! Merci pour votre réponse. – deb