2009-08-03 5 views
41

MS Access에는 중복 행을 찾기위한 sql 코드를 생성하는 버튼이 있습니다. SQL Server 2005/2008 Managment Studio에이 기능이 있는지 여부는 알 수 없습니다.T-SQL 코드가 중복 된 것을 찾는 방법은 무엇입니까?

  1. 이있는 경우 지적 바랍니다 곳

  2. 그렇지 않은 경우, 나는이 같은 코드를 생성하기위한 T-SQL 도우미를 수있는 방법을 말해주십시오.

답변

107

글쎄, 당신은 당신의 테이블에 중복으로 전체 행이있는 경우 그렇지 않으면 적어도 기본 키 값이 다른 것, 적어도 해당 테이블에 설정된 기본 키를 가지고있다.

그러나, 여기에 열 집합에 중복을 얻을 수있는 SQL 구축하는 방법 :이 열 COL1-col4에있는 행을 찾을 수

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

을 동일한 값 조합, 두 번 이상있다 . 예컨대

다음 표에, 행 2 + 3 것이 중복 :

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

두 행은 열 COL1-col4의 공통 값을 공유하며, 따라서, 해당 SQL하여 중복으로 간주된다. 분석 할 열을 모두 포함하도록 열 목록을 확장하십시오.

+0

당신의 코드가 내가 기대만큼 어렵지 않다 때문에, 포인트를 가지고 . 다른 SQL 언어에서는 수동으로 코드를 작성하기가 어려울 수 있습니다. –

+3

표준 SQL이 아니어야하며 T-SQL에만 국한되지 않습니다. MySQL, SQLite, Oracle, Sybase, DB2 등에서 동일해야합니다. –

+0

맞습니다. 구문 강조와 시끄러운 코드가 없어 MS Access에서 생성 된 코드가 이해하기 어려웠고 이전에는 시도조차하지 않았다고 믿게되었습니다. –

2

AFAIK, 그렇지 않습니다. select 문을 테이블의 모든 필드로 그룹화하고 개수가 1보다 큰 where 절을 사용하여 필터링합니다.

행이 키를 제외하고 복제되는 경우 키를 포함하지 마십시오. 선택 필드. 당신은 SQL 서버 2005 +를 사용하는 경우

51

, 다른 컬럼과 함께 모든 행을 보려면 다음 코드를 사용할 수 있습니다

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 
는 youd가도 삭제 (또는 기타 작업) 할 수

이를 사용하여 중복 기술 :

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBER은 매우 강력하다 -이 졸을 발견 http://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1하는 방법을 알려주고 있습니다. 게다가 스 니펫에는 PK도 포함됩니다. /necro – theTuxRacer

+0

상단에 투표해야 함 – SQueek

+0

또 다른 이점은 내가 본 접근법에 따라 그룹보다 빠르게 실행되는 것입니다. –

5

에서 그것에 BOL 문서를 참조하십시오 - 당신이 함께 할 수있는 많은있다 의 ution 나는 하나 개 이상의 중복 필드 전체 행을 덤프 필요하지만 테이블의 모든 필드 이름을 입력하지 않으려는 경우 :

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col 
관련 문제