2011-01-27 9 views
3

잠재적으로 중복 행 (가능한 NULL 값)을 포함하는 (1 ~ 000,000 행) 큰 테이블이 있습니다.중복 행 제거 # 2

  1. 선택에만 distinc 행 :

    는 내가하고 싶은 것은 이것이다.

  2. 'id'필드가 중복 된 행을 제거하십시오.

는의 테이블을 보자 : 내가 얻고 싶은 것은

id | a | b  
1 | 2 | 3  
2 | 8 | 7  
3 | 9 | 10  
2 | 8 | 7  
3 | 20| 12 

: 아이디 3 행을 제거하는 동안 ID 2

id | a | b  
1 | 2 | 3  
2 | 8 | 7 

행은 하나 개의 사본에 보존됩니다.

나에 대해 생각했다 :

  1. SELECT DISTINCT id, a, b FROM table; 별개의 행만 가져옵니다.
  2. 어떻게 든 중복 ID를 제거하려면 (1)의 결과를 필터링하십시오.

어떻게 접근하는 것이 가장 좋을까요?

+2

SO 검색 상자에'sql remove duplicate rows'를 입력했을 때 발견 한 것에 대해 궁금합니다. 제가 한 40 페이지의 결과를 얻었습니까? :-) 죄송합니다, 잽을 저항 할 수 없습니다 : http://stackoverflow.com/search?q=sql+remove+duplicate+rows – paxdiablo

+1

행 2가 두 번 반복되고 아래에 나열되어 있지만 행 1 두 번 반복되지 않습니다 참조하십시오 아래에 나열되어 있습니다. 약간 혼란 스럽 습니다만, 아래 1 행만 또는 1 행 3 행만 가질 예정 이었습니까? – Neil

+0

@Neil, 내용이 동일했기 때문에'2'가 살아남은 것 같습니다.'3'은 두 레코드가 다르기 때문에 버려졌습니다. (즉, 모든 사본이 동일하면 ID의 사본 하나를 보관하고, 그렇지 않은 경우에는 ID를 버립니다.) 이는 내 유령 주석을 부정확하게 만듭니다. case :-) Petr에게 사과하면. – paxdiablo

답변

0

페트르이 보이는

은 다음과 같습니다 : 모든 행 ID가 발생하는 경우 ONLY ONCE ID가 한 번 이상 나타나는 모든 행 - 레코드의 다른 모든 필드는 동일합니다.

제외 : ID가 두 번 이상 나오는 모든 행 - 및 다른 필드는 정확히 일치하지 않습니다.

select ID, min(a) a, min(b) b 
    from YourTable 
    group by ID 
    having min(a) = max(a) 
     and min(b) = max(b) 

a와 b를 비교할 다른 열이 있으면 선택 필드 목록과 해당하는 값에 각각 값을 추가하십시오. 당신이 제공 한 데이터 샘플에서 값이 그래서 행 ID가 = 3 이후 던져 얻을 것이다

ID MIN(A) MIN(B) Having MIN(A) MAX(A) MIN(B) MAX(B) 
1 2  3    2  2  3  3 
2 8  7    8  8  7  7 
3 9  10    9  20  10  12  

될 쿼리에서 반환 (동일 분에 실패 가짐)과의 최대() 두 열 모두에서 동일한 열. 그런 다음이 테이블을 새 테이블에 복사 할 수 있습니다. 테이블을 한 번만 통과하면 ...

2

세 번째 대답 이제 문제는 조금 더 명확한 것을 ... 코멘트 당, 당신이 조합을 원하는처럼

SELECT id, min(a) as a, min(b) as b 
FROM (SELECT DISTINCT id, a, b FROM table) t 
GROUP BY id 
HAVING count(*) =1 
+0

문제는 테이블에 모든 행이 있어야한다는 것입니다. 데이터를 선택하는 동안 필터링을 수행해야합니다 ... – Petr

+0

@Petr 질문 : '2. 중복 된 'id'필드가있는 행을 삭제하십시오. ' 어느 것이 혼란 스럽습니까? – jzd

+0

"테이블에서 가져온 것이 아니라 SELECT 결과에서 제거"를 의미했습니다. 죄송합니다. – Petr

0

데이터베이스를 다시 작성할 수 있습니까? 아니면 기본 키로 id를 사용하여 원본에서 새 테이블을 만들 수 있습니까? SQL은 나머지 부분을 처리 할 수 ​​있습니다.

+1

답변에 댓글이 포함되지 않아야합니다. ;-) – Chintan