메뉴 건너뛰기

조회 수 1949 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

MySQL DB작업을 하다보면 table에 포함된 중복된 데이터를 골라내서 삭제하고 싶을때가 있다.

revenue라는 테이블안에 collect_date, currency, amount라는 세개의 필드가 있다고 가정할때, collect_date currency가 동일하다면 중복된 데이터라고 가정한다.

샘플 데이터

2017-01-01, KRW, 10
2017-01-01, KRW, 10
2017-01-01, USD, 2
2017-01-02, KRW, 34
2017-01-01, USD, 2

위 데이터에서 2017-01-01, KRW, 10 가 중복된 것을 볼 수있다. 중복 데이터를 제거하려면 어떻게 해야할까?

1차 시도: 실패

DELETE
FROM revenue 
WHERE id IN 
(
    (SELECT id FROM revenue GROUP BY collect_date, currency HAVING count(*) > 1)
) 
  • GROUP BY 쿼리를 이용하여 데이터를 aggregate 한 후에 중복된 데이터가 하나 이상 존재하는 경우를 찾는다.
  • 찾아진 데이터의 id 값을 SELECT해서 DELETE한다.

이렇게 단순히 접근하면 아래와 같은 에러를 만나게 된다.

You can't specify target table 'revenue' for update in FROM clause

MySQL에는 SELECT 서브쿼리를 실행한 테이블과 동일한 테이블에서 DELETE하지 못하는 제약이 걸려있기 때문에 발생하는 에러이다. 이 에러메시지를 피해가기 위해서 별도로 테이블을 생성해서 중간 데이터를 한번 저장한 후에 DELETE 쿼리만 다시 실행하면 된다. 하지만 단지 DELETE 쿼리 하나를 위해 명시적으로 임시 테이블을 추가로 생성한다는것은 너무 번거로웠다. 그래서 뭔가 더 간단한 방법이 있지 않을까해서 찾아보니 다음과 같이 해결이 가능했다.

2차 시도: 성공

DELETE
FROM revenue 
WHERE id IN 
(
    SELECT id FROM (SELECT id FROM revenue GROUP BY collect_date, currency HAVING count(*) > 1) temp_table
) 
  • GROUP BY 쿼리를 이용하여 데이터를 aggregate 한 후에 중복된 데이터가 하나 이상 존재하는 경우를 찾는다.
  • 찾아진 데이터의 id 값을 temp_table 이라는 임시테이블로 명명한다.
  • temp_table로부터 id 값을 다시 SELECT해서 DELETE한다.

이 방법에서는 SELECT한 데이터를 temp_table이라는 임시테이블로 지정한 후에 temp_table로 부터 SELECT id값으로 reveue 테이블에 있는 데이터를 DELETE했다. 즉, 같은 테이블에 대한 DELETE 작업이 아니기 때문에 제약을 피할 수 있게 된다.


List of Articles
번호 제목 날짜 조회 수
46 order by field 와 union, 원하는 대로 정렬 하기 2021.03.26 768
45 SQL 고급 file 2017.12.22 6035
44 Union 사용법. 여러 테이블의 같은 값을 한번 쿼리로 추출하기 2017.11.21 3918
43 UPDATE ~ CASE 문을 사용한 조건별 업데이트 file 2020.07.28 1396
42 [mysql,mariaDB] 컬럼 암호화, 복호화 2020.11.25 775
41 [MySQL] 백업 및 복구 2017.04.12 5392
40 [MySQL] 세로열을 가로열로 출력하기 2019.03.05 2097
39 각각의 게시판에서 제일 최근글하나씩을 모아 정렬 2016.08.30 5812
38 날짜 관련 함수 모음. 2017.12.22 3976
37 날짜와 시간 데이터 2016.12.23 5996
36 날짜형(DATETIME) 빼기 2021.03.26 147
35 다른 테이블 데이터를 원하는 테이블에 업데이트 시키기 2017.11.16 5076
34 다양한 단위의 시간차 구하기 2015.12.19 8360
33 덤프할때 한글깨짐 해결 2016.12.23 5635
32 데이타베이스 또는 테이블 정보 2016.12.23 5534
31 데이터베이스 파티셔닝이란 2017.12.28 4262
30 데이터베이스별 / 테이블별 용량 확인 하기 2023.01.10 115
29 두 테이블을 비교하여 한쪽테이블에는 있지만 다른 테이블에는 없는 값을 뽑아내보자! 2017.11.21 5388
28 문자형 데이터 2016.12.23 5646
27 백업시 캐릭터셋(charset) 지정하기 2017.04.12 5071
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved