SQL 사용자 Tip & 강좌
Problem
Primary Key 가 없는 테이블에 동일한 값의 중복된 행이 있다면 구별하기가 어렵습니다..
이 경우 여러분은 중복된 행을 어떻게 삭제 하시나요?
Solution
SET ROWCOUNT 옵션을 사용. 사용자가 지정한 행수를 반환하여 중복된 행을 삭제하며
기본적으로는 SET ROWCOUNT 0 옵션은 모든 행이 반환 됩니다.
아래 예제를 이용하여 Test 해 보겠습니다.
1. Test테이블 생성 후 데이터 입력
CREATE TABLE dbo.duplicateTest
(
ID int,
FirstName nvarchar(25),
LastName nvarchar(25)
)
INSERT INTO dbo.duplicateTest VALUES ( 1 , N'장' , N'동건' )
INSERT INTO dbo.duplicateTest VALUES ( 2 , N'고' , N'소영' )
INSERT INTO dbo.duplicateTest VALUES ( 3 , N'전' , N'지현' )
INSERT INTO dbo.duplicateTest VALUES ( 1 , N'장' , N'동건' )
2. 전체 행을 조회합니다.
SELECT * FROM dbo.duplicateTest;
3. 삭제 대상인 중복된 행을 조회해 봅니다.
SELECT * FROM dbo.duplicateTest WHERE ID = 1 AND FirstName = N'장' AND LastName = N'동건'
4. 위에서 언급했듯이 중복된 행 삭제를 위해 SET ROWCOUNT 옵션을 사용하여 삭제합니다.
SET ROWCOUNT 1 --반환행수지정
DELETE FROM dbo.duplicateTest WHERE ID = 1
SET ROWCOUNT 0 --해제
5. 삭제 결과 확인
SELECT * FROM dbo.duplicateTest
위 결과와 같이 중복된 2개의 행 중 SET ROWCOUNT 1 옵션으로 인해
1개의 행만 영향을 받은 것을 확인하실 수 있습니다.
추가적으로 SQL 2005 이후 버전은 TOP 절을 이용하셔도 됩니다.
1. 전체 행을 조회합니다.
SELECT * FROM dbo.duplicateTest
2. TOP 절을 사용하여 삭제합니다.
DELETE TOP (1) FROM dbo.duplicateTest WHERE ID = 1
3. 삭제 결과 확인
SELECT * FROM dbo.duplicateTest
그렇다면 삭제해야 될 중복값이 multiple 하다면 어떻게 해야 될까요?
위에서 말씀 드린 TOP을 응용하시면 되겠습니다.
1. 중복값을 100 행 입력합니다.
INSERT INTO dbo.duplicateTest VALUES ( 1 , N'장' , N'동건' )
GO 100
2. 입력된 행을 확인합니다.
SELECT * FROM dbo.duplicateTest;
3. TOP절과 카운트 쿼리를 이용해서 사용자가 원하는 행 수만을 남기고
나머지는 지우도록 합니다. 3개만 남기고 지워 보도록 하죠...
DELETE TOP ( SELECT COUNT (*) - 3 FROM dbo.duplicateTest WHERE ID = 1 )
FROM dbo.duplicateTest
WHERE ID = 1;
4. 결과를 확인합니다.
SELECT * FROM dbo.duplicateTest;
간단한 내용이지만 막상 생각 안 날 때가 가끔 있어서 Posting 해봅니다.

제가 사용하는 방법은..
SELECT
SEQ
,FRST_NM
,LAST_NM
INTO #DUP_LIST
FROM DUP_TEST_LIST
GROUP BY
SEQ
,FRST_NM
,LAST_NM
HAVING COUNT(*) > 1
DELETE A
FROM DUP_TEST_LIST AS A
JOIN #DUP_LIST AS B
ON A.SEQ = B.SEQ
AND A.FRST_NM = B.FRST_NM
AND A.LAST_NM = B.LAST_NM
INSERT INTO DUP_TEST_LIST
SELECT * FROM #DUP_LIST

하만철
코난

SQL 2005 이상이라면 다음과 같은 방법도 가능할 것 같습니다.
마지막 줄의 WHERE절의 숫자를 조절하면 몇개 행까지 남길지 설정 가능합니다.
그럼 즐거운 하루 되세요~ ^^
create table A (col1 int, col2 int)
insert into A select 1,1
insert into A select 1,2
insert into A select 1,3
insert into A select 2,3
insert into A select 2,4
insert into A select 2,4
delete T1
from (
select
col1
, col2
, row_number() over(partition by col1 order by col1, col2 desc) as X
from A
) T1
where T1.X>1