sub_title
 MSSQL
제   목 MSSQL - GROUP BY 를 이용한 중복 데이타 삭제
작성자 다자래 등록일 2008-07-14 20:08:25 조회수 66,883

[MSSQL - GROUP BY 를 이용한 중복 데이타 삭제]


- GROUP BY HAVING 을 이용한 중복 데이타 삭제

중복 데이타가 있나 없나 체크만 하면 뭐하나? 중복 데이타를 삭제할 수도 있어야지? 하시는 분들을 위해서
앞의 예제에서 사용되었던, 쿼리문을 이용해서 간단한 중복 데이타 삭제 쿼리를 만들어 보겠습니다.
중복 테이타가 있는 테이블은 앞의 예제에서 사용되었던 "loginLog_tbl" 을 그대로 사용하는 것으로 하겠습니다.

"loingLog_tbl"의 uid 컬럼을 기준으로 한다면 kimchi 와 mfcchang 이 각 2회, 3회 중복되어 있고 아래와 같은 쿼리문을 사용해서 보다 정확히 파악할 수 있었습니다.

SELECT uid, count(*) AS loginCount FROM loginLog_tbl GROUP BY uid HAVING count(*) > 1

출력된 결과는 아래와 같습니다. 데이타가 딸랑 9개 인지라 눈으로 파악한 거랑 차이가 없습니다.



우리는 이 테이블에서 kimchi 와 mfcchang 의 uid 값중 seq 컬럼이 Max 값이 아닌 값을 지우도록 하겠습니다. 결국 기준이 되는 컬럼은 seq 컬럼입니다. 아래와 같이 SELECT 절 앞부분에 Max(seq) 부분을 추가하여 중복 데이타 중 seq 가 가장 큰 데이타를 SELECT 해 옵니다.

SELECT Max(seq) AS seq, uid, count(*) AS loginCount FROM loginLog_tbl GROUP BY uid HAVING count(*) > 1

그리고 아래와 같이 위의 쿼리문과 loginLog_tbl 자신을 self 조인해 보겠습니다.

SELECT a.seq AS seq
FROM loginLog_tbl A INNER JOIN ( SELECT MAX(seq) AS seq, uid, count(*) AS loginCount FROM loginLog_tbl
GROUP BY uid HAVING count(*) >1) B
ON A.uid = B.uid and A.seq <> B.seq

위의 쿼리문은 중복 데이타의 seq 값중 가장 큰 값을 제외한 seq 값들 중에 A.uid 와 B.uid 가 같은 것을 SELECT 하라는 뜻입니다. 한눈에 파악 가능하실 겁니다. 이로서 중복 데이타 중 가장 큰 값을 제외한 데이타를 가져오는 쿼리문은 끝났습니다. 하지만 바로 여기에다 DELETE 명령어를 붙이면 에러가 납니다. 왜 에러가 나는지는 다들 잘 아시리라 믿습니다.

DELETE 문을 붙이기 위해서 아래와 같이 수정합니다.

DELETE FROM loginLog_tbl
WHERE seq IN (
SELECT
a.seq AS seq
FROM loginLog_tbl A INNER JOIN ( SELECT MAX(seq) AS seq, uid, count(*) AS loginCount FROM loginLog_tbl
GROUP BY uid HAVING count(*) >1) B
ON A.uid = B.uid and A.seq <> B.seq )

위의 쿼리문이 중복 데이타를 삭제하는 최종 쿼리문입니다. 실행하면 loginLog_tbl 에서 3개의 행이 삭제되었다는 메시지가 출력될 것입니다.

작성자: 다자래(mfcchang@naver.com)
웹제작 토탈 커뮤니티 http://www.webmadang.net
 
10
    
 
0
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
34  인덱스를 위한 교재 추천 부탁 드립니다.   member 난모르겠 0 / 0 23405 2020-06-28
33  테이블 부하에 대해서...?   member 헨씀히포 0 / 0 23224 2019-05-24
32  MSSQL - 문자함수(len함수와 datalength 함수) 이미지   admin 웹마당넷 3 / 0 41081 2017-09-10
31  MSSQL - 백업 데이터를 다른 데이터베이스로 복원하기 이미지   admin 웹마당넷 6 / 2 29857 2015-07-05
30  MSSQL - SELECT 결과를 테이블로 만들기 이미지   admin 웹마당넷 1 / 0 27709 2015-06-26
29  기본 데이타 베이스 저장소 위치 바꾸기   member 아침마당 1 / 1 26434 2010-11-04
28  SQL Server 2008 복원시 트랜잭션 로그 백업   member 아침마당 1 / 0 26537 2010-09-25
27  SQL 인젝션 공격을 당했을 경우 인젝션 스크립트 지우는 저장 프로시저   member 아침마당 1 / 0 26077 2010-09-14
26  SQL Server 트랜잭션 로그 파일 줄이는 방법   member 아침마당 0 / 1 32450 2010-09-14
25  [MSSQL] SQL Server 2008 테이블 디자인 수정시 주의 사항   member 아침마당 1 / 0 28225 2010-08-22
24  [MSSQL] ISNULL 함수 간단 예제   member 아침마당 4 / 1 47998 2010-08-05
23  MSSQL - SELECT 와 동시에 INSERT 하기   admin 웹마당넷 14 / 3 153923 2009-02-03
22  MSSQL - IDENTITY 값 초기화 하기   admin 웹마당넷 3 / 2 63463 2009-01-27
21  MS-SQL 클러스터드 인덱스를 어떤 컬럼(들)에 생성하는 것이 유리할까?   member 마카로니 0 / 0 30014 2009-01-08
20  테이블 및 개체의 정보를 확인하기 위한 시스템 저장 프로시저(System Stored pr..   admin 웹마당넷 0 / 0 27632 2008-12-20
19  MSSQL 조인(JOIN)을 이용한 UPDATE 및 DELETE   admin 웹마당넷 5 / 0 53899 2008-11-29
18  SQL injection 웹에서 체크하기   member 수확물 0 / 0 26860 2008-10-10
17  MSSQL - CASE WHEN문   member 다자래 1 / 0 69969 2008-09-19
16  [MSSQL] 파티션 정보 검색   member 수확물 0 / 0 28703 2008-09-08
15  [MSSQL] DDL_Trigger_Example   member 수확물 0 / 0 34650 2008-09-08
14  [MSSQL] xml을 이용한 split   member 수확물 1 / 0 28823 2008-08-26
13  MSSQL - UNION ALL을 이용했을때 테이블명 가져오기 이미지   member 다자래 0 / 0 40225 2008-08-21
12  MSSQL - NULL 값을 다른 값으로 대체하기   member 다자래 8 / 4 101421 2008-08-21
11  [MSSQL] View안에 저장프로스져를 쓰는 방법   member 수확물 0 / 0 45393 2008-08-08
10  MSSQL - 숫자 세자리 마다 콤마(쉼표) 찍기   member 다자래 5 / 0 59247 2008-08-07
write
[2] button