복붙노트

[SQL] 특정 필드에 중복을 찾기 위해 문을 선택

SQL

특정 필드에 중복을 찾기 위해 문을 선택

여러 필드에 중복을 찾기 위해 SQL 문으로 나를 도와 드릴까요?

예를 들어, 의사 코드 :

select count(field1,field2,field3) 
from table 
where the combination of field1, field2, field3 occurs multiple times

그리고 위의 진술에서 내가 첫 번째 제외한 모든 레코드를 선택하고 싶은 여러 번가있는 경우.

해결법

  1. ==============================

    1.여러 레코드가있는 필드의 목록을 얻으려면, 당신은 사용할 수 있습니다 ..

    여러 레코드가있는 필드의 목록을 얻으려면, 당신은 사용할 수 있습니다 ..

    select field1,field2,field3, count(*)
      from table_name
      group by field1,field2,field3
      having count(*) > 1
    

    행을 삭제하는 방법에 대한 자세한 내용은이 링크를 확인하십시오.

    http://support.microsoft.com/kb/139444

    편집 : 다른 사용자가 언급 한 바와 같이, 당신은 위의 링크에있는 접근 방식을 사용하기 전에 "첫 번째 행"를 정의하는 방법을 결정하기위한 기준이 있어야한다. 당신이 필요한 경우 절과 하위 쿼리에 의해 주문을 사용해야합니다 것을 기준으로합니다. 당신은 몇 가지 샘플 데이터를 게시 할 수 있다면, 그것은 도움이 정말 것이다.

  2. ==============================

    2.나는 당신이 당신의 데이터에 대한 주문의 어떤 종류가 있다고 가정 있도록, "처음"을 언급. 이제 데이터가 일부 필드 ID에 의해 정렬되어 있다고 가정하자.

    나는 당신이 당신의 데이터에 대한 주문의 어떤 종류가 있다고 가정 있도록, "처음"을 언급. 이제 데이터가 일부 필드 ID에 의해 정렬되어 있다고 가정하자.

    이 SQL은 첫 번째를 제외하고 당신에게 중복 된 항목을 얻어야한다. 그것은 기본적으로 (a) 동일한 필드와 (b)와 다른 행 낮은 ID가 존재하는 모든 행을 선택한다. 성능은 큰되지 않습니다, 그러나 당신의 문제를 해결할 수 있습니다.

    SELECT A.ID, A.field1, A.field2, A.field3
      FROM myTable A
     WHERE EXISTS (SELECT B.ID
                     FROM myTable B
                    WHERE B.field1 = A.field1
                      AND B.field2 = A.field2
                      AND B.field3 = A.field3
                      AND B.ID < A.ID)
    
  3. ==============================

    3.이것은 내가 좋아하는 SQL 서버 2005 재미있는 솔루션입니다. 나는 "첫 번째 제외한 모든 레코드"에 의해 그 가정거야, 당신은 우리가 "최초의"인 행을 식별하는 데 사용할 수있는 또 다른 "ID"열이 있음을 의미한다.

    이것은 내가 좋아하는 SQL 서버 2005 재미있는 솔루션입니다. 나는 "첫 번째 제외한 모든 레코드"에 의해 그 가정거야, 당신은 우리가 "최초의"인 행을 식별하는 데 사용할 수있는 또 다른 "ID"열이 있음을 의미한다.

    SELECT id
        , field1
        , field2
        , field3
    FROM
    (
        SELECT id
            , field1
            , field2
            , field3
            , RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
        FROM table_name
    ) a
    WHERE [rank] > 1
    
  4. ==============================

    4.중복 값을 확인하려면 :

    중복 값을 확인하려면 :

    with MYCTE  as (
        select row_number() over ( partition by name  order by name) rown, *
        from tmptest  
        ) 
    select * from MYCTE where rown <=1
    
  5. ==============================

    5.나중에 SQL Server 2005 또는를 사용하고 (당신의 질문에 대한 태그 2008 SQL 서버를 나타냅니다) 경우 조인 사용하는 몇 가지 이유로 바람직하지 또는 비현실적이다, 당신은 첫 번째 후 중복 레코드를 반환하는 순위 기능을 사용할 수 있습니다. 다음 예제 프로그램이 그것은 또한 조사 된 컬럼에 널 (null) 값으로 작동하는 조치이다.

    나중에 SQL Server 2005 또는를 사용하고 (당신의 질문에 대한 태그 2008 SQL 서버를 나타냅니다) 경우 조인 사용하는 몇 가지 이유로 바람직하지 또는 비현실적이다, 당신은 첫 번째 후 중복 레코드를 반환하는 순위 기능을 사용할 수 있습니다. 다음 예제 프로그램이 그것은 또한 조사 된 컬럼에 널 (null) 값으로 작동하는 조치이다.

    create table Table1 (
     Field1 int,
     Field2 int,
     Field3 int,
     Field4 int 
    )
    
    insert  Table1 
    values    (1,1,1,1)
            , (1,1,1,2)
            , (1,1,1,3)
            , (2,2,2,1)
            , (3,3,3,1)
            , (3,3,3,2)
            , (null, null, 2, 1)
            , (null, null, 2, 3)
    
    select    *
    from     (select      Field1
                        , Field2
                        , Field3
                        , Field4
                        , row_number() over (partition by   Field1
                                                          , Field2
                                                          , Field3
                                             order by       Field4) as occurrence
              from      Table1) x
    where     occurrence > 1
    

    모든 "그룹"중 첫 번째 레코드가 제외되어이 예제를 실행 한 후 공지 사항 및 널 (null) 값이 그 기록을 제대로 처리됩니다.

    당신이 그룹 내에서 레코드를 주문하기 위해 사용할 수있는 열이없는 경우는 주문에 의한 열로 파티션별로 열을 사용할 수 있습니다.

  6. ==============================

    6.

    CREATE TABLE #tmp
    (
        sizeId Varchar(MAX)
    )
    
    INSERT  #tmp 
        VALUES ('44'),
            ('44,45,46'),
            ('44,45,46'),
            ('44,45,46'),
            ('44,45,46'),
            ('44,45,46'),
            ('44,45,46')
    
    
    SELECT * FROM #tmp
    DECLARE @SqlStr VARCHAR(MAX)
    
    SELECT @SqlStr = STUFF((SELECT ',' + sizeId
                  FROM #tmp
                  ORDER BY sizeId
                  FOR XML PATH('')), 1, 1, '') 
    
    
    SELECT TOP 1 * FROM (
    select items, count(*)AS Occurrence
      FROM dbo.Split(@SqlStr,',')
      group by items
      having count(*) > 1
      )K
      ORDER BY K.Occurrence DESC    
    
  7. ==============================

    7.각 SELECT 문 sepratley 수를 가지고이 쿼리를 시도 :

    각 SELECT 문 sepratley 수를 가지고이 쿼리를 시도 :

    select field1,count(field1) as field1Count,field2,count(field2) as field2Counts,field3, count(field3) as field3Counts
    from table_name
    group by field1,field2,field3
    having count(*) > 1
    
  8. from https://stackoverflow.com/questions/4434118/select-statement-to-find-duplicates-on-certain-fields by cc-by-sa and MIT license