본문 바로가기
DB/Oracle

중복 데이터 삭제

by JobKea 2019. 8. 21.
반응형

오늘 업무를 하다가 보니

인터페이스 연속 실행으로 인해서 약 3000건 정도가 중복으로 들어갔다.

 

그래서 중복 데이터를 삭제하는 법을 찾다가 나온 내용을 잃어버릴까봐 저장해둔다.

 

1. 1개 컬럼 기준으로 삭제할 경우

  => 같은 데이터를 구분하는 값이 1개 컬럼이라면 이걸로 해결할수 있다.

  1) 방법 1

  DELETE FROM (A 테이블)

      WHERE ROWID IN (

                    SELECT ROWID 

                      FROM (

                            SELECT * 

                              FROM (

                                    SELECT ROW_NUMBER() OVER(PARTITION BY A.컬럼명 ORDER BY A.컬럼명) AS num

                                      FROM (A 테이블)

                                    )

                             WHERE num > 1 -- num의 값이 1초과인 데이터들만 삭제

                            )

                      );

 

   2) 방법 2

     -- 중복된 데이터중에서 ROWID가 큰 값(나중에 등록된 데이터) 제거

     DELETE FROM (A 테이블)

     WHERE ROWID > (SELECT MIN(ROWID)

                    FROM (B 테이블)

                    WHERE B.컬럼A = A.컬럼A);

  

   3) 방법 3

    -- 나중에 들어온 데이터를 살릴경우

     DELETE FROM (A 테이블)

     WHERE ROWID < (SELECT MAX(ROWID)

                    FROM (B 테이블)

                    WHERE A.컬럼A = B.컬럼B);

 

2. 여러개 컬럼을 기준으로 삭제할 경우

  이번에 사용한 방법이다. 중복 데이터를 고르는 기준이 1개 컬럼이 아니라 여러개 컬럼을 동시에

  해야할 경우 아래와 같이 사용했다.

 

--    DELETE 테이블A
     WHERE ROWID IN (
                     SELECT MAX(ROWID)
                      FROM 테이블A
                     GROUP BY 컬럼A, 컬럼B, 컬럼C,컬럼D
                    HAVING COUNT(1) > 1)

 

  데이터 삭제는 아주 민감한건이다. 그래서 항상 조회를 해본뒤에 사용해야한다.

 

 

반응형

'DB > Oracle' 카테고리의 다른 글

Drive specified in output filename does not exist.  (0) 2020.03.24
Oracle Client 설치하기  (0) 2020.03.19
PL/SQL (1)  (0) 2019.01.23

댓글