SQL 고급 - 중복 제거

하나, 무거운 두 가지 기본 방법

1 DISTINCT

## 
테이블 : 내장 
은 CREATE  TABLE의 교사 ( 
teacher_id VARCHAR ( 50 ) 
TEACHER_NAME VARCHAR ( 50 ) 
id_no VARCHAR ( 50 ) 
) 

는 CREATE  인덱스 idx_teacher_id 교사 (teacher_id)를, 

중복 데이터를 삽입 : 
삭제  로부터 교사,
 삽입  INTO 교사  ( ' 20180204060001 ' , ' ' , ' 530102192005080114 ' );
INSERT  INTO 교사 VALUES ( ' 20180204060002 ' , ' 张의成' , ' 530102192005080115 ' );
INSERT  INTO 교사 VALUES ( ' 20180204060001 ' , ' 李斌' , ' 530102192005080114 ' );
INSERT  INTO 교사 VALUES ( ' 20180204060002 ' , ' 张의成' , ')
 INSERT  INTO 교사 VALUES ( ' 20,180,204,060,001 ' , ' ' , ' 530,102,192,005,080,114 ' )
 INSERT  INTO 교사 VALUES ( ' 20,180,204,060,002 ' , ' ' , ' 530,102,192,005,080,115 ' ) 


DISTINCT에 다시 쿼리 
은 SELECT  DISTINCT  *  FROM 교사; 


그룹 중복 제거의 질문에 의해 :
 선택 (SELECT)  
teacher_id, 
MIN (TEACHER_NAME)
MIN (id_no)
 FROM 교사
 GROUP  BY teacher_id;

중복 데이터가 동일하다, 당신은에 의해 그룹을 사용할 수 있지만 중복 데이터가 정확하지 않을 때, 아마 잘못 동일 갈 것이다;


둘째, 다른 6 디엠의 방법

## 
동일한 데이터를 반복, 그들은 그룹을 사용 하여 ,하지만 중복 데이터가 동일하지 않을 때, 잘못 될 수도, 

데이터를 삽입 
삭제  의를 교사,
 삽입  INTO 교사  ( ' 20,180,204,060,001 ' , ' ' , ' 530,102,192,005,080,114 ' )
 삽입   교사  ( ' 20,180,204,060,002 ' , ' ' , ' 530,102,192,005,080,115 ' )
 삽입   교사  (' 20180204060001 ' , ' 흰색 함 ' , ' 630,102,192,005,080,114 ' )
 삽입  INTO 교사  ( ' 20,180,204,060,002 ' , ' ' , ' 630,102,192,005,080,115는 ' ); 


### 
( 1 ) 부질 수있다 + 그룹  별로 :
 SELECT  *  로부터 교사 (a.teacher_id, a.id_no) 에서이 
( SELECT b.teacher_id, 최대(b.id_no) id_no 에서 교사 B의 그룹  b.teacher_id); 


### 
( 2 )
 SELECT  *  FROM 교사 A를 NOT EXISTS  
( SELECT 1 FROM 교사 B WHERE a.teacher_id = b.teacher_id AND a.id_no > b.id_no); 
###은 
( 3 )
 SELECT 을 수행합니다. * FROM 교사 A를 WHERE a.id_no <= ALL (
   SELECT b.id_No을
      

  FROM 교사 B
   WHERE a.teacher_id = b.teacher_id 
); 


###은 
( 4 )
 SELECT 을 수행합니다. * 
FROM 교사
 INNER  JOIN 교사 B
 ON a.teacher_id = b.teacher_id
 AND a.id_no > =를 b.id_no
 GROUP  BY a.id_no a.teacher_id, a.teacher_name,
 HAVING  COUNT ( * ) = 1 ; 


### 
( 5 )
 SELECT  
teacher_id, 
SUBSTRING_INDEX (
GROUP_CONCAT (TEACHER_NAME의 ORDER  BY id_no ASC ),
 ' , ' , 1 ), 
SUBSTRING_INDEX ( 
GROUP_CONCAT (id_no ORDER  BY id_no ASC ),
 ' , ' , 1 )
 FROM 교사
 GROUP  BY teacher_id; 


### 
( 6 )
 SELECT id_no teacher_id, TEACHER_NAME,
 FROM 
( 
SELECT  
teacher_id, TEACHER_NAME, id_no, 
ROW_NUMBER () OVER (분할 BYteacher_id
 ORDER  BY id_no ASC를 ) AS rn_no
 의 FROM 교사 
) 
를 Where rn_no =  1 ; 

MySQL은 ROW_NUMBER () 표현을 지원하지 않습니다!

추천

출처www.cnblogs.com/weiyiming007/p/11463167.html