뭐 딱히 제목을 정하기가 뭐시기 해서, 이렇게 잡았다.
PK가 있고 PK 가 아닌 다른 실질 키 에서 중복이 났다면,
당연히 이는 CTE 즉, 공통테이블 뷰를 만들어 해결할 수 있다.
이 부분도 나중에 다루게 되겠지만,
이번엔 PK 도 없으면서 해당 테이블에 전혀 구분해 줄 수 없는 경우에
중복을 없애야한다면 어떻게 해야 하는 지 알아보도록 하자.
-- 중복행 찾아 임시테이블 저장 WITH CTE AS ( SELECT USER_NO FROM T_USER GROUP BY USER_NO HAVING COUNT(*) > 1 ) SELECT USER_NO ,MAX(USER_NM) AS USER_NM ,MAX(PWD) AS PWD ,MAX(TEL) AS TEL ,MAX(MOBILE) AS MOBILE ,MAX(ADDR1) AS ADDR1 ,MAX(ADDR2) AS ADDR2 INTO #T_USER_TMP FROM T_USER WHERE USER_NO IN (SELECT USER_NO FROM CTE) GROUP BY USER_NO -- 중복행 제거 WITH CTE AS ( SELECT USER_NO FROM T_USER GROUP BY USER_NO HAVING COUNT(*) > 1 ) DELETE FROM T_USER WHERE USER_NO IN (SELECT USER_NO FROM CTE) -- 행 추가 INSERT INTO T_USER SELECT * FROM #T_USER_TMP DROP TABLE #T_USER_TMP |
우선 중복된는 애들을 공통 테이블 뷰에 넣고, group by 하여 참고하도록 한다.
대표가 될만한 컬럼을 선택 후 나머지는 모두 Max() 처리.. (모두 GROUP BY 처리해도 무방)
그렇게 하여 별도의 임시 테이블에 저장한다. (Distinct 된 행들만 별도로 저장됨.)
그리고 위의 공통테이블 뷰를 다시 활용하여, 이번엔 본 테이블에서 삭제한다.
이어서 다시 별도 보관해 두었던 테이블의 데이터를 원 테이블로 입력하도록 한다.
필요는 또 다른 방법을 낳게 한다. 자주 써먹을 데가 있을 것 같아, 메모해 둔다.
이런 것까지 구지비 해야 하는가 싶은데, 막상 해 놓고 보면 편리하고 시간을 단축 시켜줘서 좋다.
'PROGRAMMING > Database' 카테고리의 다른 글
공휴일 목록 (1949~2200년) (0) | 2018.10.01 |
---|---|
공통테이블과 조인 (0) | 2018.05.05 |
내가 주로 사용하는 SP 작성 방법 요약 (0) | 2018.04.21 |
MSSQL 동적쿼리 내 한글깨짐 (0) | 2018.03.15 |
MSSQL DB 파일 옮기기 (0) | 2018.02.22 |
댓글