특별히 primary key가 없거나 unique index가 없어서
중복되어서는 안되는데 같은 내용의 데이터가 중복되어서 쌓여있을 경우,
1개의 row만 남기고 나머지 데이터들은 모두 삭제하고 싶다면?
이 쿼리를 수정해서 사용하면 됩니다.
ROW_NUMBER() OVER(PARTITION BY RLTM_SRNO, EQT_SRNO ORDER BY ROWID)
중복되어서는 안되는 컬럼, 즉 key가 되는 컬럼을 PARTITION BY … 부분에 넣으시면 됩니다.
데이터가 같아도 오라클 내부적으로 ROWID는 모두 다르기 때문에
ROWID를 이용하여 데이터 하나만 남기고 나머지 중복데이터는 모두 제거가 가능합니다.
DECLARE
CURSOR cur IS
SELECT RW
FROM (
SELECT RLTM_SRNO,
EQT_SRNO,
REG_DTS,
ROWID AS RW,
ROW_NUMBER() OVER(PARTITION BY RLTM_SRNO, EQT_SRNO ORDER BY ROWID) AS RANK
FROM TB_CP_RLTM_NOTC_EQT_DPLY
ORDER BY RLTM_SRNO,
EQT_SRNO,
REG_DTS
)
WHERE RANK > 1;
BEGIN
FOR c IN cur LOOP
DELETE
FROM TB_CP_RLTM_NOTC_EQT_DPLY
WHERE ROWID = c.RW
;
END LOOP;
COMMIT;
END;
'프로그래밍 언어 > 쿼리문 + Oracle + MySQL' 카테고리의 다른 글
까페24(cafe24.com)의 호스팅 DB를 외부에서 DB툴로 접속하는 방법 (0) | 2017.01.09 |
---|---|
[오라클] trunc(SYSDATE)로 시분초가 0인 날짜만 가져오기 (0) | 2016.12.06 |
[MySQL] concat() 함수 사용시 값이 깨져서 나오는 문제 해결 방법 (0) | 2016.10.23 |
[오라클] 검색어 자동완성을 위한 초성, 중성, 종성 분리해서 검색하는 oracle 함수 (0) | 2016.09.12 |
SQL 쿼리문 보기 좋게 정렬해주는 사이트 - Instant SQL Formatter (0) | 2016.07.27 |
댓글