본문 바로가기
  • 읽고보고쓰고
PROGRAMMING/Database

중복된 행 제거 기술

by 체리그루브 2018. 4. 22.
728x90



뭐 딱히 제목을 정하기가 뭐시기 해서, 이렇게 잡았다.

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 된 행들만 별도로 저장됨.)


그리고 위의 공통테이블 뷰를 다시 활용하여, 이번엔 본 테이블에서 삭제한다.


이어서 다시 별도 보관해 두었던 테이블의 데이터를 원 테이블로 입력하도록 한다.


필요는 또 다른 방법을 낳게 한다. 자주 써먹을 데가 있을 것 같아, 메모해 둔다.

이런 것까지 구지비 해야 하는가 싶은데, 막상 해 놓고 보면 편리하고 시간을 단축 시켜줘서 좋다.


728x90

'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

댓글