2010-12-03 5 views
1

한 테이블에서 다른 테이블로 일부 데이터를 이동하려고합니다. 내가 생각하는 쿼리를 작성했지만 대상 테이블에는 ID가 포함 된 열이 있습니다. 내가 삽입 한 각 행에 서로 다른 연속적인 ID가 있어야합니다.Oracle 다중 삽입, 다른 ID

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; 

연속 ID를 생성하고 쿼리 "에 모두 삽입"사용의 방법이 여기에 simplificated 예는? 시퀀스? 그것은 시퀀스로 만들 수 있다면 ... 거기에 시퀀스없이 그것을하는 방법이 무엇입니까?

감사합니다.

답변

2

적절한 방법을 오라클에서 ID를 생성하는 것은 시퀀스를 사용하는 것입니다.

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

+0

일회성 단일 세션 삽입을위한 시퀀스를 만들 이유가 없습니다. ROWNUM은이 시나리오에서 완벽하게 "적합"합니다. –

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