DBMS/SQL Server (MS-SQL)

[SQL Server / MS-SQL] PK 없는 테이블 중복 데이터 제거

RYEAN 2020. 8. 12. 16:37
반응형


 

1. 이슈발생


PRIMARY KEY 가 없는 테이블에 INSERT 를 한 번 해야하는데 잘못해서 동일한 값이 여러번 삽입되었다.

고유한 값이 있다면 이를 삭제해주는데 문제가 없다만, 없다면 골치가 아프다.... (중복 데이터가 많을수록 더 더욱..)

 

1
SELECT * FROM NAME
cs

 

ENG_NAME KOR_NAME
ANNA 김유정
JESSI 이복순
JESSI 이복순
JOHN 홍길동
JOHN 홍길동
JOHN 홍길동

 

 

 

2. 해결방법


하지만 해결방법은 아주 간단하다!

ROW_NUMBER() OVER 함수를 이용하여 데이터에 순서값을 주어 중복된 값 중 하나만 두고 제거해주면 된다.

 

1
SELECT ROW_NUMBER() OVER (PARTITION BY ENG_NAME ORDER BY ENG_NAME) AS NUM, * FROM NAME
cs

 

ROW_NUMBER() OVER 함수를 이용하여 ENG_NAME 으로 파티션을 나눈 후,

ENG_NAME 을 기준으로 정렬한다라는 의미이다. (파티션과 정렬을 KOR_NAME 으로 해도 상관없다.)

 

 

그럼 아래와 같이 중복이 되는 행에 1,2,3 … 으로 구분되어 정렬된 것을 볼 수 있다.

NUM ENG_NAME KOR_NAME
1 ANNA 김유정
1 JESSI 이복순
2 JESSI 이복순
1 JOHN 홍길동
2 JOHN 홍길동
3 JOHN 홍길동

 

 

이제 위 쿼리를 이용하여 NUM=1 을 제외한 나머지 행을 삭제해주면 된다.

1
2
3
4
5
6
DELETE A
FROM (
        SELECT ROW_NUMBER() OVER (PARTITION BY ENG_NAME ORDER BY ENG_NAME) AS NUM, *
        FROM NAME
      ) A
WHERE num >= 2
 
cs

 

 

 

그럼 아래와 같이 중복된 값을 모두 제거해줄 수 있다.

ENG_NAME KOR_NAME
ANNA 김유정
JESSI 이복순
JOHN 홍길동

 

 

 

반응형