반응형
이슈 발생
PRIMARY KEY 가 없는 테이블에 INSERT 를 한 번 해야하는데 잘못해서 동일한 값이 여러번 삽입되었다.
고유한 값이 있다면 이를 삭제해주는데 문제가 없다만, 없다면 골치가 아프다.... (중복 데이터가 많을수록 더 더욱..)
1
|
SELECT * FROM NAME
|
cs |
ENG_NAME | KOR_NAME |
ANNA | 김유정 |
JESSI | 이복순 |
JESSI | 이복순 |
JOHN | 홍길동 |
JOHN | 홍길동 |
JOHN | 홍길동 |
해결 방법
하지만 해결방법은 아주 간단하다!
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 | 홍길동 |
반응형