오늘 업무를 하다가 보니
인터페이스 연속 실행으로 인해서 약 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 |
댓글