programing

중복을 찾기 위해 T-SQL 코드를 얻는 방법은 무엇입니까?

yoursource 2021. 1. 16. 10:53
반응형

중복을 찾기 위해 T-SQL 코드를 얻는 방법은 무엇입니까?


MS Access에는 중복 된 행을 찾기위한 SQL 코드를 생성하는 버튼이 있습니다. SQL Server 2005/2008 Managment Studio에이 기능이 있는지 모르겠습니다.

  1. 있다면, 어디를 가리켜주세요

  2. 그렇지 않은 경우 이와 같은 코드를 작성하기 위해 T-SQL 도우미를 어떻게 가질 수 있는지 알려주십시오.


글쎄, 테이블에 전체 행이 중복되어 있다면 적어도 해당 테이블에 대한 기본 키가 설정되지 않은 것입니다. 그렇지 않으면 적어도 기본 키 값이 다를 것입니다.

그러나 다음은 일련의 열에 대해 중복을 가져 오는 SQL을 빌드하는 방법입니다.

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

이렇게하면 col1-col4 열에 대해 동일한 값 조합이 두 번 이상있는 행을 찾습니다.

예를 들어 다음 표에서 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에서 중복으로 간주됩니다. 이를 분석하려는 모든 열을 포함하도록 열 목록을 확장합니다.


SQL Server 2005+를 사용하는 경우 다음 코드를 사용하여 다른 열과 함께 모든 행을 볼 수 있습니다.

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
FROM table

이 기술을 사용하여 중복을 삭제 (또는 다른 방법으로 작업) 할 수도 있습니다.

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 에서 BOL 기사를 참조하십시오 .


하나 이상의 중복 필드가있는 전체 행을 덤프해야 할 때이 솔루션을 찾았지만 테이블의 모든 필드 이름을 입력하고 싶지는 않습니다.

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

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

키를 제외하고 행이 중복 된 경우 선택 필드에 키를 포함하지 마십시오.


이를 수행 할 수있는 또 다른 방법은 테이블을 결합하는 것입니다.

SELECT *
FROM dbo.TableA aBase
JOIN dbo.TableA aDupes ON aDupes.ColA = aBase.ColA AND
                          aDupes.ColB = aBase.ColB
WHERE aBase.Pkey < aDupes.Pkey

참고 : aBase.Pkey <aDupes.Pkey는 조건이 항상 두 번 참이기 때문에 테이블 자체를 조인하면 일치 당 두 개의 행이 생성되기 때문에 존재합니다.

즉, 테이블 aBase에 aDupes의 행 (ColA 및 ColB 기반)과 동일한 행이있는 경우 해당 일치의 반영도 true가됩니다. 즉, aDupes에는 ColA 및 ColB를 기반으로하는 행 aBase와 동일한 행이 있습니다. 따라서 두 일치 항목이 모두 결과 집합에 반환됩니다.

테이블 중 하나에 더 낮은 키가있는 모든 결과를 임의로 선택하여이 반영을 좁히거나 제거합니다.

키가 다르면 <또는>는 중요하지 않습니다.

또한 aBase.Pkey <aDupes.Pkey 는 기본 키가 달라 지도록 강제 하기 때문에 행과 일치하는 항목을 필터링하는 작업도 처리 합니다.

참조 URL : https://stackoverflow.com/questions/1222581/how-get-the-t-sql-code-to-find-duplicates

반응형