MySQL 중복 데이터 제거 (NOT IN)

리눅스/MySQL|2015. 1. 16. 11:42
반응형

table_a(A)

 num

va

 1

 2

 3

 4

 5

 6


과 같은 데이터를(B)

 num

va 

 1

 2

 4

와 같이 중복된 값을 삭제하고 싶을때가 생기게 마련이다.


  1. 우선 값을 삭제하지 않고 원하는 결과가 나오는 쿼리를 짜 보는것이다.
    어떻게 하면 (B)와 같은 값을 도출해 낼 수 있을까?어떻게 하면 (B)와 같은 값을 도출해 낼 수 있을까?

    SELECT MIN(num),va FROM table_a GROUP BY va 


     MIN(num)

    va 

     1

     2

     4



  2. 즉 num이 1,2,4를 제외한 나머지를 삭제하는 것이다.

    SELECT MIN(num) FROM table_a GROUP BY va 


     MIN(num)

     1

     2

     4


  3. 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)값을 제외한 나머지를 삭제하라는 것이다.


  4. 하지만 이대로 한다면 에러가 발생할 것이다.
    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)|작성자 닌자 (http://ninja099.blog.me/60159002192)

반응형

댓글()