2012-10-19 2 views
0

데이터베이스에 문제가 있습니다. 값에 따라 다른 테이블에 특정 레코드의 중복 레코드를 삽입해야합니다. 먼저 커서를 사용하여 각 레코드를 가져 와서 원하는 복사본 수를 얻은 다음 복제를 위해 다른 커서를 사용했습니다. 모든 것이 잘 작동했습니다. 500 개가 넘는 기록이 있다면, 나는 천천히 죽었다. 그런 다음 몇 가지 연구를 수행하고 커서없이 삽입하는 방법을 발견했습니다.커서를 사용하지 않고 값을 기준으로 중복 레코드 삽입

INSERT INTO report(id, Name) 
     SELECT i.id,i.Name FROM (SELECT 1 AS id 
     UNION SELECT 2 
     UNION SELECT 3 
     UNION SELECT 4 
     UNION SELECT 5 
     UNION SELECT 6 
     UNION SELECT 7 
     UNION SELECT 8 
     UNION SELECT 9 
     UNION SELECT 10) AS o 
     INNER JOIN table i WHERE o.id<=i.frequence; 

여기에서 frequence는 복제 횟수입니다. 검색어를 개선하기 위해 아이디어를 삭제하십시오.

+0

이 쿼리는 꽤 멋진 것 같습니다. 다른 방법을 찾고있는 이유가 있습니까? – Tom

+0

@Tom : 수천 개의 레코드를 삽입하므로, 작은 최적화로 엄청난 시간을 절약 할 수 있습니다. 그게 이유야. – Vijaychandar

답변

1

1에서 10까지의 각 값에 대한 레코드가있는 테이블을 만든 다음 그 레코드에 조인 할 수 있습니다. 나는 그것이 더 빠를 것이라고 확신하지 않는다. 당신은 그것으로 실험해야 할 것입니다.

이 예제에서 1부터 10까지의 값을 가진 테이블을 "dup"이라고하며이 값을 포함하는 필드를 "id"라고합니다.

INSERT INTO report(id, Name) 

SELECT i.id, i.Name 

FROM table i 

     JOIN dup d 
     ON d.id <= i.frequence; 
1

당신은 당신이 위해 할 수있는, 적어도 최대 frequence의 높은가는 행 번호가 포함 된 테이블이있는 경우 :

INSERT INTO report(id, Name) 
     SELECT i.id,i.Name FROM table i 
      inner join (
       select distinct some_row_number_column from some_table 
      ) o on o.some_row_number_column <= i.frequence; 

이것은 기본적으로 당신이 무엇을하고 있는지와 동일합니다 , 그러나 지저분한 union all 문장은 피할 수 있습니다.

또는 1에서 최대 frequence까지의 숫자를 임시 테이블에 삽입 한 다음 join에서 사용하는 커서를 만들 수 있습니다. 또는 use a row numbering variable을 사용하여 필요한 순서를 생성 할 수 있습니다. 기본적으로 1에서 최대 값까지 연속적인 숫자 목록을 생성하는 모든 작업을 수행하십시오.

나는 보통이 (DB2 구문)에 대한 재귀를 사용합니다 :

INSERT INTO report(id, Name) 
     with num_list (num) as (
      values (1) 
       union all 
      select num + 1 from num_list 
       where num < (select max(frequence) from table) 
     ) 
     SELECT i.id,i.Name FROM table i 
      inner join num_list on num_list.num <= i.frequence; 

그러나, MySQL은 분명히, 재귀를 지원하지 않습니다.

관련 문제