2010-05-03 2 views
7

새 테이블의 숫자 열에 대해 증분 값을 생성하면서 Oracle의 한 테이블에서 다른 테이블로 일부 데이터를 복사해야합니다. 이 행은 사소한 수의 행 (100)을 가진 한 번만 수행하는 연습입니다.INSERT SELECT 문에서 증분 숫자 열 값 생성

이 문제에 대한 적절한 해결책이 있지만보다 세련된 방법이 있는지 궁금합니다.

내가 지금처럼, 임시 순서로 일을 해요 :

CREATE SEQUENCE temp_seq 
    START WITH 1; 

INSERT INTO new_table (new_col, copied_col1, copied_col2) 
    SELECT temp_seq.NEXTVAL, o.* 
     FROM (SELECT old_col1, old_col2 
       FROM old_table, 
      ORDER BY old_col1) o; 

DROP SEQUENCE temp_seq; 

시퀀스 또는 기타 임시 개체를 만들지 않고 함께 할 수있는 방법이 있나요? 특히, 자체 포함 된 INSERT SELECT 문을 사용하여이 작업을 수행 할 수 있습니까?

방아쇠를 옵션으로 고려하십시오.

추가 정보 : 새 행이 삽입되는 순서를 제어하고 싶습니다. 이전 테이블에서 작성한 순서와 다를 수 있습니다. (위의 ORDER BY 절을 추가했습니다.). 하지만 여전히 새로운 순차 열이 1부터 시작되기를 바랍니다.

비슷한 질문이 있지만 내 질문의 구체적인 내용은 원래대로 생각됩니다.

답변

10

ROWNUM을 사용할 수 있습니다. 당신의 결과에서이 의사 열이 숫자 행을 :

Insert Into new_table (new_col, copied_col1, copied_col2) 
    Select Rownum, old_col1, old_col2 
    From (
     Select old_col1, old_col2 
     From old_table 
     Order By old_col1 
    ); 
+0

피터, 추가 된 기준을 참조하십시오. 질문을 추가했습니다. 이 방법은 이전 테이블에서 만들어진 순서대로 행을 삽입하는 것처럼 보이지만 내 주문을 시행하고 싶습니다. 이 요구 사항이 아니라면 방법이 완벽 할 것입니다. 어떤 아이디어? –

+0

@Charles : 내 쿼리는 실제로 행을 정렬하지 않으므로 생성 된 순서대로 삽입됩니다 (그러나 보장되지는 않음). 내 검색어에'ORDER BY '를 적용하려 했습니까? 나는 이것이 작동하기를 기대할 것이다. –

+0

그런 다음 ORDER BY를 select 문에 추가하십시오. 그게 네가 원하는 걸 얻게 해 줄거야. ROWNUM은 단순히 검색된 순서대로 레코드의 시퀀스 번호를 생성합니다. – DCookie

-1

왜 당신은 정의하지 않습니다

Insert Into new_table (new_col, copied_col1, copied_col2) 
    Select Rownum, old_col1, old_col2 
    From old_table; 

당신이 당신의 레코드를 정렬하려면, 당신은 하위 쿼리를 사용할 필요가 new_col 열을 primary_key 또는 unique로 변경하고 autoincrement로 표시 하시겠습니까? 이렇게하면 각 인서트는 다음으로 높은 "카운트"를 얻습니다.

저는 오라클에 익숙하지 않지만, 자동 증가 기능이 내장되어있을 것입니다.

+1

@Philipp Andre : * 자동 증가 함수 *가 없기 때문에 오라클은 대신 시퀀스를 사용합니다. –

+0

@Peter Lang : 정말요? 놀랍지 만 오랫동안 나는 오라클과 놀았습니다. 잘 알고 있습니다. 고맙습니다! –

+0

그게 내가 SQL Server에서 한 것입니다. :) –