2013-07-11 2 views
1

마스터 테이블에서 레코드의 서브 세트로 테이블을 생성하려고합니다. 예를 들어, 내가 가진 :일부를 제외하고 많은 레코드를 삽입하는 방법

id name code 
1 peter 73 
2 carl 84 
3 jack 73 

내가 같은 피터의 코드를 가지고 있기 때문에 잭 피터 칼이 아닌를 저장할. 20M 레코드가 있기 때문에 성능이 필요합니다.

나는이 시도 :

SELECT id, name, DISTINCT(code) INTO new_tab 
FROM old_tab 
WHERE (conditions) 

을하지만 작동하지 않습니다.

+3

첫 번째 문제점은 타이 브레이커를 정의하는 중입니다. Peter와 Jack이 직면했을 때, Jack over Jack을 선택하는 이유는 무엇입니까? 가장 낮은 신분증을 사용하고 있습니까? 일단 나는 타이 브레이커를 안다. 나는 질의를 쓸 수있다. –

+0

최소 ID로 레코드를 원합니다. 감사. –

답변

3

, 다음이 그것을해야 DESC에서 ASC에 :

insert into new_tab (id, name, code) 
(SELECT id, name, code 
FROM 
(
    SELECT id, name, code, rank() as rnk OVER (PARTITION BY code ORDER BY id ASC) 
    FROM old_tab WHERE rnk = 1 
) 
) 
1

파생 테이블을 사용하여 각 코드의 minID를 찾은 다음 외부 테이블의 해당 ID에 다시 조인하여 oldTab에서 해당 ID에 대한 나머지 열을 가져올 수 있습니다.

insert into new_tab (id, name, code) 
(SELECT id, name, code 
FROM 
(
    SELECT id, name, code, rank() as rnk OVER (PARTITION BY code ORDER BY id DESC) 
    FROM old_tab WHERE rnk = 1 
) 
) 

을 코드 당 최소 id을 위해, 단지 순위에 정렬 순서를 변경 : 당신이 code 당 최대 id과 행을 선택하려는 가정

select id,name,code 
insert into newTabFROM 
from old_tab t inner join 
    (SELECT min(id) as minId, code 
    from old_tab group by code) x 
on t.id = x.minId 
WHERE (conditions) 
+0

새로운 테이블을 생성하려면 'into newTab'이어야합니다 ('insert'를 제거하십시오). 만약 기존의 테이블에 삽입해야한다면,'insert into'는 첫 번째 라인이어야합니다. –

0

이 시도 :

CREATE TABLE #Temp 
(
    ID INT, 
    Name VARCHAR(50), 
    Code INT 
) 

INSERT #Temp VALUES (1, 'Peter', 73) 
INSERT #Temp VALUES (2, 'Carl', 84) 
INSERT #Temp VALUES (3, 'Jack', 73) 

SELECT t2.ID, t2.Name, t2.Code 
FROM #Temp t2 
    JOIN (
     SELECT t.Code, MIN(t.ID) ID 
     FROM #temp t 
      JOIN (
       SELECT DISTINCT Code 
       FROM #Temp 
       ) d 
       ON t.Code = d.Code 
     GROUP BY t.Code 
      ) b 
    ON t2.ID = b.ID 
관련 문제