복붙노트

[SQL] SQL 서버에서 중복 행을 찾기

SQL

SQL 서버에서 중복 행을 찾기

나는 조직의 SQL Server 데이터베이스를 가지고 있고, 많은 중복 행이 있습니다. 나는이와 속는의 양을 모두 잡아 SELECT 문을 실행할뿐만 아니라 각 조직과 관련된 ID를 반환합니다.

성명 같은 :

SELECT     orgName, COUNT(*) AS dupes  
FROM         organizations  
GROUP BY orgName  
HAVING      (COUNT(*) > 1)

같은를 반환합니다

orgName        | dupes  
ABC Corp       | 7  
Foo Federation | 5  
Widget Company | 2 

그러나 나는 그들의 ID를 잡기 위해 또한 같은 것입니다. 이 작업을 수행 할 수있는 방법이 있습니까? 어쩌면 같은

orgName        | dupeCount | id  
ABC Corp       | 1         | 34  
ABC Corp       | 2         | 5  
...  
Widget Company | 1         | 10  
Widget Company | 2         | 2  

그 이유는 이러한 조직에 대한 링크가, 내가 (사용자가 속는 여러 조직 대신 같은 조직에 링크 그러므로 속는 제거)를 통합하고 싶다고 사용자의 별도의 테이블도이 있다는 것. 하지만하지 나사 무엇을 할 수 있도록 내가 수동 부분을 싶습니다하지만 사용자의 목록을 갈 수 있도록 나는 아직도 모든 속는 여러 조직의 ID를 반환 진술을해야합니다.

해결법

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

    1.

    select o.orgName, oc.dupeCount, o.id
    from organizations o
    inner join (
        SELECT orgName, COUNT(*) AS dupeCount
        FROM organizations
        GROUP BY orgName
        HAVING COUNT(*) > 1
    ) oc on o.orgName = oc.orgName
    
  2. ==============================

    2.다음과 같은 쿼리를 실행하고 최대 (ID)와 중복을 발견하고 해당 행을 삭제할 수 있습니다.

    다음과 같은 쿼리를 실행하고 최대 (ID)와 중복을 발견하고 해당 행을 삭제할 수 있습니다.

    SELECT orgName, COUNT(*), Max(ID) AS dupes 
    FROM organizations 
    GROUP BY orgName 
    HAVING (COUNT(*) > 1)
    

    하지만 당신은이 쿼리를 몇 번 실행해야합니다.

  3. ==============================

    3.당신은 이런 식으로 작업을 수행 할 수 있습니다 :

    당신은 이런 식으로 작업을 수행 할 수 있습니다 :

    SELECT
        o.id, o.orgName, d.intCount
    FROM (
         SELECT orgName, COUNT(*) as intCount
         FROM organizations
         GROUP BY orgName
         HAVING COUNT(*) > 1
    ) AS d
        INNER JOIN organizations o ON o.orgName = d.orgName
    

    당신은 (각 중 하나를 떠나) 삭제 될 수 있습니다 단지 레코드를 반환하려는 경우, 당신은 사용할 수 있습니다 :

    SELECT
        id, orgName
    FROM (
         SELECT 
             orgName, id,
             ROW_NUMBER() OVER (PARTITION BY orgName ORDER BY id) AS intRow
         FROM organizations
    ) AS d
    WHERE intRow != 1
    

    편집 : SQL 서버 2000는 ROW_NUMBER () 함수를 가지고 있지 않습니다. 대신, 당신은 사용할 수 있습니다 :

    SELECT
        o.id, o.orgName, d.intCount
    FROM (
         SELECT orgName, COUNT(*) as intCount, MIN(id) AS minId
         FROM organizations
         GROUP BY orgName
         HAVING COUNT(*) > 1
    ) AS d
        INNER JOIN organizations o ON o.orgName = d.orgName
    WHERE d.minId != o.id
    
  4. ==============================

    4.올바른으로 표시이 솔루션은 나를 위해 작동하지 않았다, 그러나 나는 단지 좋은 일이 대답을 발견한다 : mysql에서 중복 행의 목록을 가져옵니다을

    올바른으로 표시이 솔루션은 나를 위해 작동하지 않았다, 그러나 나는 단지 좋은 일이 대답을 발견한다 : mysql에서 중복 행의 목록을 가져옵니다을

    SELECT n1.* 
    FROM myTable n1
    INNER JOIN myTable n2 
    ON n2.repeatedCol = n1.repeatedCol
    WHERE n1.id <> n2.id
    
  5. ==============================

    5.당신이 시도 할 수 있습니다, 그것은 당신을 위해 최선

    당신이 시도 할 수 있습니다, 그것은 당신을 위해 최선

     WITH CTE AS
        (
        SELECT *,RN=ROW_NUMBER() OVER (PARTITION BY orgName ORDER BY orgName DESC) FROM organizations 
        )
        select * from CTE where RN>1
        go
    
  6. ==============================

    6.당신은 삭제 중복하려는 경우 :

    당신은 삭제 중복하려는 경우 :

    WITH CTE AS(
       SELECT orgName,id,
           RN = ROW_NUMBER()OVER(PARTITION BY orgName ORDER BY Id)
       FROM organizations
    )
    DELETE FROM CTE WHERE RN > 1
    
  7. ==============================

    7.

    select * from [Employees]
    

    중복 레코드를 찾는 1) CTE 사용

    with mycte
    as
    (
    select Name,EmailId,ROW_NUMBER() over(partition by Name,EmailId order by id) as Duplicate from [Employees]
    )
    select * from mycte
    

    2)를 사용하여 GROUPBY

    select Name,EmailId,COUNT(name) as Duplicate from  [Employees] group by Name,EmailId 
    
  8. ==============================

    8.

    Select * from (Select orgName,id,
    ROW_NUMBER() OVER(Partition By OrgName ORDER by id DESC) Rownum
    From organizations )tbl Where Rownum>1
    

    rowum로 기록 그래서> 1 테이블에서 중복 레코드 될 것입니다. 먼저 기록에 의해 그룹 '으로 파티션은'그들에게 일련 번호를 부여하여이를 직렬화. ROWNUM 그래서> 1은 삭제 될 수있는 중복 레코드 될 것입니다.

  9. ==============================

    9.

    select column_name, count(column_name)
    from table_name
    group by column_name
    having count (column_name) > 1;
    

    SRC : https://stackoverflow.com/a/59242/1465252

  10. ==============================

    10.

    select a.orgName,b.duplicate, a.id
    from organizations a
    inner join (
        SELECT orgName, COUNT(*) AS duplicate
        FROM organizations
        GROUP BY orgName
        HAVING COUNT(*) > 1
    ) b on o.orgName = oc.orgName
    group by a.orgName,a.id
    
  11. ==============================

    11.

    select orgname, count(*) as dupes, id 
    from organizations
    where orgname in (
        select orgname
        from organizations
        group by orgname
        having (count(*) > 1)
    )
    group by orgname, id
    
  12. ==============================

    12.당신은 선택 중복 행에 대한 몇 가지 방법이있다.

    당신은 선택 중복 행에 대한 몇 가지 방법이있다.

    내 솔루션을 먼저 예를 들어,이 테이블을 고려

    CREATE TABLE #Employee
    (
    ID          INT,
    FIRST_NAME  NVARCHAR(100),
    LAST_NAME   NVARCHAR(300)
    )
    
    INSERT INTO #Employee VALUES ( 1, 'Ardalan', 'Shahgholi' );
    INSERT INTO #Employee VALUES ( 2, 'name1', 'lname1' );
    INSERT INTO #Employee VALUES ( 3, 'name2', 'lname2' );
    INSERT INTO #Employee VALUES ( 2, 'name1', 'lname1' );
    INSERT INTO #Employee VALUES ( 3, 'name2', 'lname2' );
    INSERT INTO #Employee VALUES ( 4, 'name3', 'lname3' );
    

    첫 번째 솔루션 :

    SELECT DISTINCT *
    FROM   #Employee;
    
    WITH #DeleteEmployee AS (
                         SELECT ROW_NUMBER()
                                OVER(PARTITION BY ID, First_Name, Last_Name ORDER BY ID) AS
                                RNUM
                         FROM   #Employee
                     )
    
    SELECT *
    FROM   #DeleteEmployee
    WHERE  RNUM > 1
    
    SELECT DISTINCT *
    FROM   #Employee
    

    두 번째 해결책 : 신원 필드

    SELECT DISTINCT *
    FROM   #Employee;
    
    ALTER TABLE #Employee ADD UNIQ_ID INT IDENTITY(1, 1)
    
    SELECT *
    FROM   #Employee
    WHERE  UNIQ_ID < (
        SELECT MAX(UNIQ_ID)
        FROM   #Employee a2
        WHERE  #Employee.ID = a2.ID
               AND #Employee.FIRST_NAME = a2.FIRST_NAME
               AND #Employee.LAST_NAME = a2.LAST_NAME
    )
    
    ALTER TABLE #Employee DROP COLUMN UNIQ_ID
    
    SELECT DISTINCT *
    FROM   #Employee
    

    모든 솔루션의 끝이 명령을 사용하여

    DROP TABLE #Employee
    
  13. ==============================

    13.나는 당신이 필요로하는 것을 알고 있다고 생각 내가 대답 사이에 혼합 필요하고 내가 자기가 원하는 솔루션을 찾은 것 같아 :

    나는 당신이 필요로하는 것을 알고 있다고 생각 내가 대답 사이에 혼합 필요하고 내가 자기가 원하는 솔루션을 찾은 것 같아 :

    select o.id,o.orgName, oc.dupeCount, oc.id,oc.orgName
    from organizations o
    inner join (
        SELECT MAX(id) as id, orgName, COUNT(*) AS dupeCount
        FROM organizations
        GROUP BY orgName
        HAVING COUNT(*) > 1
    ) oc on o.orgName = oc.orgName
    

    최대 ID를 가진 당신에게 중복의 ID와 그가 요구 것입니다 원래의 하나를 줄 것이다 :

    id org name , dublicate count (missing out in this case) 
    id doublicate org name , doub count (missing out again because does not help in this case)
    

    단지 슬픈 것은 당신은이 양식에 넣어 얻을

    id , name , dubid , name
    

    여전히 도움이되기를 바랍니다

  14. ==============================

    14.우리는이 열이 테이블에게 테이블 '학생'이 있다고 가정합니다 :

    우리는이 열이 테이블에게 테이블 '학생'이 있다고 가정합니다 :

    이제 우리는 중복 레코드를보고 싶어 이 쿼리를 사용합니다 :

    select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;
    

    +---------------------+------------+---+
    | student_name        | student_id | c |
    +---------------------+------------+---+
    | usman               |        101 | 3 |
    | muhammadusmanyaqoob |        103 | 2 |
    +---------------------+------------+---+
    
  15. ==============================

    15.나는 테이블에서 중복 레코드를 얻을 수있는 더 나은 옵션을 가지고

    나는 테이블에서 중복 레코드를 얻을 수있는 더 나은 옵션을 가지고

    SELECT x.studid, y.stdname, y.dupecount
    FROM student AS x INNER JOIN
    (SELECT a.stdname, COUNT(*) AS dupecount
    FROM student AS a INNER JOIN
    studmisc AS b ON a.studid = b.studid
    WHERE (a.studid LIKE '2018%') AND (b.studstatus = 4)
    GROUP BY a.stdname
    HAVING (COUNT(*) > 1)) AS y ON x.stdname = y.stdname INNER JOIN
    studmisc AS z ON x.studid = z.studid
    WHERE (x.studid LIKE '2018%') AND (z.studstatus = 4)
    ORDER BY x.stdname
    

    위의 질의 쇼의 독특한 학생 ID와 중복 차례 나오는 수를 가지는 모든 중복 된 이름 결과

    는 SQL의 결과를 보려면 여기를 클릭하십시오

  16. ==============================

    16.

     /*To get duplicate data in table */
    
     SELECT COUNT(EmpCode),EmpCode FROM tbl_Employees WHERE Status=1 
      GROUP BY EmpCode HAVING COUNT(EmpCode) > 1
    
  17. ==============================

    17.시험

    시험

    SELECT orgName, id, count(*) as dupes
    FROM organizations
    GROUP BY orgName, id
    HAVING count(*) > 1;
    
  18. from https://stackoverflow.com/questions/2112618/finding-duplicate-rows-in-sql-server by cc-by-sa and MIT license