2013-07-11 1 views
0

테이블 t1이 있습니다. 일부 행에는 모든 열에 중복이 있습니다 (예 : id).
t1id은 AUTO_INCREMENT이고 1MIL 개의 행이 있습니다.

t2은 데이터가없는 새 테이블이며 id은 AUTO_INCREMENT가 필요하지 않습니다. 아마도이 필드에 대해 새 열을 생성 할 것입니다.

t1에서 새 테이블로 복사 t2 중복 행을 필터링합니다.

Q : 내가 t2 생성 한 후, 어떻게 t2가 중복 행

내가 아마존에 생각이 없다고 그래서, 모든 컬럼에 t1에서 t2 고유 한 값으로 t1에서 복사 할 수 있습니다 RDS ENGINE=InnoDB

t1 - 이것은 내가 가지고있는 것입니다.

+---+-----+-----+------+-------+ 
|id |fname|lname|mytext|morevar| 
|---|-----|-----|------|-------| 
| 1 | joe | min | abc | 123 | 
| 2 | joe | min | abc | 123 | 
| 3 | mar | kam | def | 789 | 
| 4 | kel | smi | ghi | 456 | 
+------------------------------+ 

T2 -이 내가이 내 시도

+---+-----+-----+------+-------+ 
|id |fname|lname|mytext|morevar| 
|---|-----|-----|------|-------| 
| 1 | joe | min | abc | 123 | 
| 3 | mar | kam | def | 789 | 
| 4 | kel | smi | ghi | 456 | 
+------------------------------+ 

로 끝날 싶은 것이 있습니다 만, 가지고 : Error Code: 1136. Column count doesn't match value count at row 1

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
SELECT DISTINCT st.mytext 
FROM t1 st 
WHERE st.id>0 
AND st.id<=1000 
+0

예't1'은'mytext'에서 중복 된 데이터뿐만 아니라 다른 모든 열 ('id' 제외)에서도 보여줍니다. 데이터가 다를 경우 어떤 레코드를 보존해야 하는가? – eggyal

+0

@eggyal 중복 된 부분을 확인하지 않으십니까? 't2'는 내가 끝내고 자하는 것이며, 데이터를 포함하지 않습니다. –

+1

아니요,하지만't1'은 중복을 포함하고 있는데 왜 레코드 2보다 레코드 1을 선택했는지 확실하지 않습니다. 실제로, 열 (하지만 'mytext'와 동일) 대신 레코드 1보다 레코드 2를 선택했을 수 있습니까? – eggyal

답변

1

사용 GROUP BY 그냥 열이 구별 할 수 있습니다. 다른 열이 중복되는 경우마다 다를

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
SELECT id, fname, lname, mytext, morevar 
FROM t1 st 
WHERE st.id>0 
AND st.id<=1000 
GROUP BY mytext 

그것은 임의로 그들로부터 값을 선택한다 (반드시 동일한 행 짝수 행).

2

가장 쉬운 방법은 group by를 사용하는 것입니다 : 열 값이 같은 행에서 오는 보장되지 않기 때문에

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
    SELECT id,fname,lname,mytext,morevar 
    FROM t1 st 
    WHERE st.id>0 AND st.id<=1000 
    group by mytext; 

그러나, 기술적으로,이 올바르지 않습니다. 그래서, 올바른 방법은 다음과 같습니다

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
    SELECT st.id, st.fname, st.lname, st.mytext, st.morevar 
    FROM t1 st join 
     (select mytext, min(id) as minid 
      from t1 
      group by mytext 
     ) mint 
     on st.id = minid 
    WHERE st.id>0 AND st.id<=1000 ; 
+0

내가 1MIL 행을 가지고 있기 때문에 얼마나 큰 덩어리가 내가 'where'절을 설정하도록 권장합니까? 한 번에 1,000 개의 행이 있습니까? 10K 행? 100K 행? –

+0

@tq. . . 나는 일반적으로 일괄 삽입하지 않습니다. 이 쿼리의 비용은 삽입 부분이 아니라 'mytext'에 대한 집계가 될 것입니다. –

+0

1000 분의 일괄 처리를 수행하는 데 10 분 이상이 걸렸으며 프로세스가 계속 진행 중입니까?이 문제가 있다고 생각하십니까? 이게 보통 오래 걸리나요? –

1

은 중복의 작은 ID 번호를 선택하고 계정에 모든 열을 소요됩니다,이 코드를 사용해보십시오.

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
SELECT min(id) id, fname, lname, mytext, morevar 
FROM t1 
WHERE t1.id > 0 and t1.id <= 1000 
GROUP BY fname, lname, mytext, morevar 
ORDER BY id; 
관련 문제