복붙노트

[SQL] SQL 테이블에서 중복 값 찾기

SQL

SQL 테이블에서 중복 값 찾기

그것은 하나 개의 필드에 중복을 쉽게 찾을 수 있습니다 :

SELECT name, COUNT(email) 
FROM users
GROUP BY email
HAVING COUNT(email) > 1

우리는 테이블 그래서 만약

ID   NAME   EMAIL
1    John   asd@asd.com
2    Sam    asd@asd.com
3    Tom    asd@asd.com
4    Bob    bob@asd.com
5    Tom    asd@asd.com

그들은 모두 같은 이메일을 가지고 있기 때문에이 쿼리는 우리 존, 샘, 톰, 톰를 줄 것이다.

그러나, 내가 원하는 동일한 이메일과 이름이 중복을 얻는 것입니다.

즉, 내가 "톰", "톰"싶어.

나는이 필요한 이유는 : 나는 실수를하고, 중복 된 이름과 이메일 값을 삽입 할 수 있었다. 내가 먼저 그들을 찾아 낼 필요가 그래서 지금은, / 제거 중복을 변경해야합니다.

해결법

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

    1.

    SELECT
        name, email, COUNT(*)
    FROM
        users
    GROUP BY
        name, email
    HAVING 
        COUNT(*) > 1
    

    열 모두에서 간단하게 그룹.

    참고 : 기존의 ANSI 표준은 GROUP BY의 모든 비 집계 열을 가지고있다 그러나 이것은 "기능 종속성"의 아이디어로 변경되었습니다

    지원 일치하지 않습니다 :

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

    2.이 시도:

    이 시도:

    declare @YourTable table (id int, name varchar(10), email varchar(50))
    
    INSERT @YourTable VALUES (1,'John','John-email')
    INSERT @YourTable VALUES (2,'John','John-email')
    INSERT @YourTable VALUES (3,'fred','John-email')
    INSERT @YourTable VALUES (4,'fred','fred-email')
    INSERT @YourTable VALUES (5,'sam','sam-email')
    INSERT @YourTable VALUES (6,'sam','sam-email')
    
    SELECT
        name,email, COUNT(*) AS CountOf
        FROM @YourTable
        GROUP BY name,email
        HAVING COUNT(*)>1
    

    산출:

    name       email       CountOf
    ---------- ----------- -----------
    John       John-email  2
    sam        sam-email   2
    
    (2 row(s) affected)
    

    당신이 원하는 경우 DUPS의 ID는 이것을 사용 :

    SELECT
        y.id,y.name,y.email
        FROM @YourTable y
            INNER JOIN (SELECT
                            name,email, COUNT(*) AS CountOf
                            FROM @YourTable
                            GROUP BY name,email
                            HAVING COUNT(*)>1
                        ) dt ON y.name=dt.name AND y.email=dt.email
    

    산출:

    id          name       email
    ----------- ---------- ------------
    1           John       John-email
    2           John       John-email
    5           sam        sam-email
    6           sam        sam-email
    
    (4 row(s) affected)
    

    삭제 중복 시도 :

    DELETE d
        FROM @YourTable d
            INNER JOIN (SELECT
                            y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
                            FROM @YourTable y
                                INNER JOIN (SELECT
                                                name,email, COUNT(*) AS CountOf
                                                FROM @YourTable
                                                GROUP BY name,email
                                                HAVING COUNT(*)>1
                                            ) dt ON y.name=dt.name AND y.email=dt.email
                       ) dt2 ON d.id=dt2.id
            WHERE dt2.RowRank!=1
    SELECT * FROM @YourTable
    

    산출:

    id          name       email
    ----------- ---------- --------------
    1           John       John-email
    3           fred       John-email
    4           fred       fred-email
    5           sam        sam-email
    
    (4 row(s) affected)
    
  3. ==============================

    3.이 시도:

    이 시도:

    SELECT name, email
    FROM users
    GROUP BY name, email
    HAVING ( COUNT(*) > 1 )
    
  4. ==============================

    4.당신은 중복을 삭제하려면, 여기에 트리플로 짝수 / 홀수 행을 발견하는 것보다 그것을 할 수있는 훨씬 간단한 방법 서브 - 선택 :

    당신은 중복을 삭제하려면, 여기에 트리플로 짝수 / 홀수 행을 발견하는 것보다 그것을 할 수있는 훨씬 간단한 방법 서브 - 선택 :

    SELECT id, name, email 
    FROM users u, users u2
    WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
    

    그래서 삭제합니다 :

    DELETE FROM users
    WHERE id IN (
        SELECT id/*, name, email*/
        FROM users u, users u2
        WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
    )
    

    훨씬 더 쉽게 읽고 이럴을 이해하기

    참고 : 유일한 문제는 당신이 행이 삭제되지있을 때까지 당신이 때마다 중복 단지 1 각의를 삭제하기 때문에 요청을 실행해야한다는 것입니다

  5. ==============================

    5.다음을 시도해보십시오

    다음을 시도해보십시오

    SELECT * FROM
    (
        SELECT Id, Name, Age, Comments, Row_Number() OVER(PARTITION BY Name, Age ORDER By Name)
            AS Rank 
            FROM Customers
    ) AS B WHERE Rank>1
    
  6. ==============================

    6.

     SELECT name, email 
        FROM users
        WHERE email in
        (SELECT email FROM users
        GROUP BY email 
        HAVING COUNT(*)>1)
    
  7. ==============================

    7.조금 늦게 파티에 그러나 나는 모든 중복 ID를 찾는 데 정말 멋진 해결 방법을 찾을 수 :

    조금 늦게 파티에 그러나 나는 모든 중복 ID를 찾는 데 정말 멋진 해결 방법을 찾을 수 :

    SELECT GROUP_CONCAT( id )
    FROM users
    GROUP BY email
    HAVING ( COUNT(email) > 1 )
    
  8. ==============================

    8.이 코드를 시도

    이 코드를 시도

    WITH CTE AS
    
    ( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn)
    FROM ccnmaster )
    select * from CTE 
    
  9. ==============================

    9.이 선택은 / 중복의 각 그룹에서 하나 개의 레코드를 제외한 모든 중복 레코드를 삭제합니다. 따라서, 삭제 잎 중복의 각 그룹의 모든 고유 기록 + 하나 개의 기록.

    이 선택은 / 중복의 각 그룹에서 하나 개의 레코드를 제외한 모든 중복 레코드를 삭제합니다. 따라서, 삭제 잎 중복의 각 그룹의 모든 고유 기록 + 하나 개의 기록.

    선택 중복 :

    SELECT *
    FROM table
    WHERE
        id NOT IN (
            SELECT MIN(id)
            FROM table
            GROUP BY column1, column2
    );
    

    삭제 중복 :

    DELETE FROM table
    WHERE
        id NOT IN (
            SELECT MIN(id)
            FROM table
            GROUP BY column1, column2
    );
    

    기록의 더 많은 양의주의, 그것은 성능 문제가 발생할 수 있습니다.

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

    10.오라클 작업의 경우이 방법이 바람직 할 것입니다 :

    오라클 작업의 경우이 방법이 바람직 할 것입니다 :

    create table my_users(id number, name varchar2(100), email varchar2(100));
    
    insert into my_users values (1, 'John', 'asd@asd.com');
    insert into my_users values (2, 'Sam', 'asd@asd.com');
    insert into my_users values (3, 'Tom', 'asd@asd.com');
    insert into my_users values (4, 'Bob', 'bob@asd.com');
    insert into my_users values (5, 'Tom', 'asd@asd.com');
    
    commit;
    
    select *
      from my_users
     where rowid not in (select min(rowid) from my_users group by name, email);
    
  11. ==============================

    11.

    select name, email
    , case 
    when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
    else 'No'
    end "duplicated ?"
    from users
    
  12. ==============================

    12.당신이 당신의 테이블에 중복 행이 있는지 확인하고자하는 경우에, 나는 쿼리 아래 사용 :

    당신이 당신의 테이블에 중복 행이 있는지 확인하고자하는 경우에, 나는 쿼리 아래 사용 :

    create table my_table(id int, name varchar(100), email varchar(100));
    
    insert into my_table values (1, 'shekh', 'shekh@rms.com');
    insert into my_table values (1, 'shekh', 'shekh@rms.com');
    insert into my_table values (2, 'Aman', 'aman@rms.com');
    insert into my_table values (3, 'Tom', 'tom@rms.com');
    insert into my_table values (4, 'Raj', 'raj@rms.com');
    
    
    Select COUNT(1) As Total_Rows from my_table 
    Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 
    
  13. ==============================

    13.이것은 내가 함께 왔어요 쉬운 일이다. 그것은 공통 테이블 식 (CTE) 및 파티션 창을 (내가 생각하는이 기능은 SQL 2008에있는 이상) 사용합니다.

    이것은 내가 함께 왔어요 쉬운 일이다. 그것은 공통 테이블 식 (CTE) 및 파티션 창을 (내가 생각하는이 기능은 SQL 2008에있는 이상) 사용합니다.

    이 예는 중복 된 이름과 생년월일 모든 학생을 찾습니다. 필드는 당신은 OVER 절에서 중복 이동을 확인하고 싶다. 당신은 당신이 투사에서 원하는 다른 필드를 포함 할 수 있습니다.

    with cte (StudentId, Fname, LName, DOB, RowCnt)
    as (
    SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt
    FROM tblStudent
    )
    SELECT * from CTE where RowCnt > 1
    ORDER BY DOB, LName
    
  14. ==============================

    14.우리는 어떻게 중복 값을 셀 수 ?? 하나는 2 배 이상이 반복된다. 그냥 계산하지 그룹 현명한.

    우리는 어떻게 중복 값을 셀 수 ?? 하나는 2 배 이상이 반복된다. 그냥 계산하지 그룹 현명한.

    단순하게

    select COUNT(distinct col_01) from Table_01
    
  15. ==============================

    15.CTE를 사용하여도 우리는이 같은 중복 된 값을 찾을 수 있습니다

    CTE를 사용하여도 우리는이 같은 중복 된 값을 찾을 수 있습니다

    with MyCTE
    as
    (
    select Name,EmailId,ROW_NUMBER() over(PARTITION BY EmailId order by id) as Duplicate from [Employees]
    
    )
    select * from MyCTE where Duplicate>1
    
  16. ==============================

    16.

     select emp.ename, emp.empno, dept.loc 
              from emp
     inner join dept 
              on dept.deptno=emp.deptno
     inner join
        (select ename, count(*) from
        emp
        group by ename, deptno
        having count(*) > 1)
     t on emp.ename=t.ename order by emp.ename
    /
    
  17. ==============================

    17.

    select id,name,COUNT(*) from user group by Id,Name having COUNT(*)>1
    
  18. ==============================

    18.ID HAVING COUNT (ID) BY 표 군으로부터 SELECT ID, COUNT (ID)> 1;

    ID HAVING COUNT (ID) BY 표 군으로부터 SELECT ID, COUNT (ID)> 1;

    나는이 특정 열에서 반복 값을 검색 제대로 작동 것이라 생각합니다.

  19. ==============================

    19.

    SELECT * FROM users u where rowid = (select max(rowid) from users u1 where
    u.email=u1.email);
    
  20. ==============================

    20.이것은 또한 작업, 어쩌면 시도 제공해야합니다.

    이것은 또한 작업, 어쩌면 시도 제공해야합니다.

      Select * from Users a
                where EXISTS (Select * from Users b 
                    where (     a.name = b.name 
                            OR  a.email = b.email)
                         and a.ID != b.id)
    

    당신은 접두사 또는 예를 들어, 같은 일반적인 변화의 몇 가지 종류가 중복 귀하의 경우 특히 좋은 검색하는 경우 메일에서 새 도메인. 당신은이 컬럼에서) (대체 사용할 수 있습니다

  21. ==============================

    21.당신은 (하나 또는 여러 CRITERIAS가) 중복 된 데이터를 찾아 실제 행을 선택합니다.

    당신은 (하나 또는 여러 CRITERIAS가) 중복 된 데이터를 찾아 실제 행을 선택합니다.

    with MYCTE as (
        SELECT DuplicateKey1
            ,DuplicateKey2 --optional
            ,count(*) X
        FROM MyTable
        group by DuplicateKey1, DuplicateKey2
        having count(*) > 1
    ) 
    SELECT E.*
    FROM MyTable E
    JOIN MYCTE cte
    ON E.DuplicateKey1=cte.DuplicateKey1
        AND E.DuplicateKey2=cte.DuplicateKey2
    ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt
    

    http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

  22. ==============================

    22.이름이 중복되어 삭제 기록에

    이름이 중복되어 삭제 기록에

    ;WITH CTE AS    
    (
    
        SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY name) AS T FROM     @YourTable    
    )
    
    DELETE FROM CTE WHERE T > 1
    
  23. ==============================

    23.테이블에서 중복 레코드에서 확인합니다.

    테이블에서 중복 레코드에서 확인합니다.

    select * from users s 
    where rowid < any 
    (select rowid from users k where s.name = k.name and s.email = k.email);
    

    또는

    select * from users s 
    where rowid not in 
    (select max(rowid) from users k where s.name = k.name and s.email = k.email);
    

    테이블에 중복 레코드를 삭제합니다.

    delete from users s 
    where rowid < any 
    (select rowid from users k where s.name = k.name and s.email = k.email);
    

    또는

    delete from users s 
    where rowid not in 
    (select max(rowid) from users k where s.name = k.name and s.email = k.email);
    
  24. ==============================

    24.

    SELECT name, email,COUNT(email) 
    FROM users 
    WHERE email IN (
        SELECT email 
        FROM users 
        GROUP BY email 
        HAVING COUNT(email) > 1)
    
  25. ==============================

    25.SELECT COLUMN_NAME, TABLE_NAME GROUP BY 컬럼 1의 FROM COUNT (*)를 갖는 COUNT (*)> 1;

    SELECT COLUMN_NAME, TABLE_NAME GROUP BY 컬럼 1의 FROM COUNT (*)를 갖는 COUNT (*)> 1;

  26. ==============================

    26.아래 그림과 같이 우리는 집계 함수에 작동하는 현재 가지고 사용할 수 있습니다

    아래 그림과 같이 우리는 집계 함수에 작동하는 현재 가지고 사용할 수 있습니다

    create table #TableB (id_account int, data int, [date] date)
    insert into #TableB values (1 ,-50, '10/20/2018'),
    (1, 20, '10/09/2018'),
    (2 ,-900, '10/01/2018'),
    (1 ,20, '09/25/2018'),
    (1 ,-100, '08/01/2018')  
    
    SELECT id_account , data, COUNT(*)
    FROM #TableB
    GROUP BY id_account , data
    HAVING COUNT(id_account) > 1
    
    drop table #TableB
    

    여기에서 두 개의 필드가 id_account 및 데이터 개수와 함께 사용되는 바와 같이 (*). 그래서, 그것은 모두 열 개 이상의 시간 같은 값을 가지는 모든 레코드를 제공 할 것입니다.

    우리는 어떤 이유로 mistakely 우리는 SQL 서버 테이블의 모든 제약 조건을 추가 할 수 놓쳤다와 기록은 프런트 엔드 응용 프로그램과 모든 열에서 중복을 삽입되었습니다. 그런 다음 우리는 테이블에서 중복 쿼리를 삭제 쿼리 아래에 사용할 수 있습니다.

    SELECT DISTINCT * INTO #TemNewTable FROM #OriginalTable
    TRUNCATE TABLE #OriginalTable
    INSERT INTO #OriginalTable SELECT * FROM #TemNewTable
    DROP TABLE #TemNewTable
    

    여기서 우리는 시킴으로 빨리 테이블의 모든 별개의 기록을 촬영하고 원래 테이블의 레코드를 삭제했습니다. 다시 우리는 원래 테이블에 새 테이블에서 모든 고유 값을 삽입 한 후 새 테이블을 삭제.

  27. ==============================

    27.이 작업을 시도 할 수 있습니다

    이 작업을 시도 할 수 있습니다

    SELECT NAME, EMAIL, COUNT(*)
    FROM USERS
    GROUP BY 1,2
    HAVING COUNT(*) > 1
    
  28. ==============================

    28.당신은 중복을 제거하는 SELECT DISTINCT 키워드를 사용할 수 있습니다. 또한 이름으로 필터링하고 테이블에 그 이름을 가진 사람을 얻을 수 있습니다.

    당신은 중복을 제거하는 SELECT DISTINCT 키워드를 사용할 수 있습니다. 또한 이름으로 필터링하고 테이블에 그 이름을 가진 사람을 얻을 수 있습니다.

  29. ==============================

    29.정확한 코드는 동일한 이메일과 이름을 잘 않거나 다른 식별자로 중복 행을 찾을 것인지 여부에 따라 다를 것입니다. ID가 다른 기본 키 또는 경우 이러한 구별이 존재하지 않는 고유 제한 조건이 있지만, 문제는이를 지정하지 않습니다. 전자의 경우에는 여러 다른 답변에 주어진 코드를 사용할 수 있습니다 :

    정확한 코드는 동일한 이메일과 이름을 잘 않거나 다른 식별자로 중복 행을 찾을 것인지 여부에 따라 다를 것입니다. ID가 다른 기본 키 또는 경우 이러한 구별이 존재하지 않는 고유 제한 조건이 있지만, 문제는이를 지정하지 않습니다. 전자의 경우에는 여러 다른 답변에 주어진 코드를 사용할 수 있습니다 :

    SELECT name, email, COUNT(*)
    FROM users
    GROUP BY name, email
    HAVING COUNT(*) > 1
    

    후자의 경우 다음을 사용 :

    SELECT name, email, COUNT(DISTINCT id)
    FROM users
    GROUP BY name, email
    HAVING COUNT(DISTINCT id) > 1
    ORDER BY COUNT(DISTINCT id) DESC
    
  30. ==============================

    30.어떻게 테이블에 중복 기록을 얻을 수 있습니다

    어떻게 테이블에 중복 기록을 얻을 수 있습니다

     SELECT COUNT(EmpCode),EmpCode FROM tbl_Employees WHERE Status=1 
     GROUP BY EmpCode HAVING COUNT(EmpCode) > 1
    
  31. from https://stackoverflow.com/questions/2594829/finding-duplicate-values-in-a-sql-table by cc-by-sa and MIT license