MySQL 중복 데이터 제거 (NOT IN)
리눅스/MySQL2015. 1. 16. 11:42
반응형
table_a(A)
num | va |
1 | A |
2 | B |
3 | A |
4 | C |
5 | A |
6 | C |
과 같은 데이터를(B)
num | va |
1 | A |
2 | B |
4 | C |
와 같이 중복된 값을 삭제하고 싶을때가 생기게 마련이다.
- 우선 값을 삭제하지 않고 원하는 결과가 나오는 쿼리를 짜 보는것이다.
어떻게 하면 (B)와 같은 값을 도출해 낼 수 있을까?어떻게 하면 (B)와 같은 값을 도출해 낼 수 있을까?SELECT MIN(num),va FROM table_a GROUP BY va
MIN(num)
va
1
A
2
B
4
C
- 즉 num이 1,2,4를 제외한 나머지를 삭제하는 것이다.
SELECT MIN(num) FROM table_a GROUP BY va
MIN(num)
1
2
4
- num 1,2,4를 제외한 나머지를 삭제해 보자.
이때 사용되는 것이 서브쿼리와 함께 NOT IN이다. 포함된 것이 아닌 이라고 해야 할까? 반대로 포함된것을 지우겠다면 IN을 사용하면 될 것이다.DELETE FROM table_a WHERE
num NOT IN (SELECT MIN(num) FROM table_a GROUP BY va)
말로 풀어보자면 table_a에 num값이 MIN(num)값을 제외한 나머지를 삭제하라는 것이다.
- 하지만 이대로 한다면 에러가 발생할 것이다.
Yon can't specify target table.... 어쩌구 저쩌구....
이는 mysql에서는 서브쿼리의 from과, delete 되는 from을 같게 사용할 수 없는 룰 때문이다.
이를 위한 꼼수는...DELETE FROM table_a WHERE
num NOT IN (SELECT * FROM (SELECT MIN(num) FROM table_a GROUP BY va) AS temp)
와 같이 서브쿼리로 한번 더 묶어서 별칭으로 지정해 주면 문제 해결...
[출처] MySQL 중복 데이터 제거 (NOT IN)|작성자 닌자
[출처] MySQL 중복 데이터 제거 (NOT IN)|작성자 닌자 (http://ninja099.blog.me/60159002192)
반응형
'리눅스 > MySQL' 카테고리의 다른 글
댓글()