복붙노트

[SQL] 여러 필드를 기반으로 SQL 테이블에서 중복 항목을 삭제하는 방법

SQL

여러 필드를 기반으로 SQL 테이블에서 중복 항목을 삭제하는 방법

나는 다음과 같이 설명되어 게임의 테이블을 가지고 :

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| id            | int(11)     | NO   | PRI | NULL    | auto_increment |
| date          | date        | NO   |     | NULL    |                |
| time          | time        | NO   |     | NULL    |                |
| hometeam_id   | int(11)     | NO   | MUL | NULL    |                |
| awayteam_id   | int(11)     | NO   | MUL | NULL    |                |
| locationcity  | varchar(30) | NO   |     | NULL    |                |
| locationstate | varchar(20) | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+

각 게임은 두 팀의 일정에 있었기 때문에 그러나 각 게임은 테이블 곳에서 중복 된 항목이 있습니다. 내가 통해보고 동일한 날짜, 시간, hometeam_id, awayteam_id, locationcity 및 locationstate 필드를 기반으로 모든 중복을 제거하는 데 사용할 수있는 SQL 문이 있습니까?

해결법

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

    1.당신은 데이터를 삭제하는 상관 하위 쿼리를 할 수 있어야합니다. 중복있는 모든 삭제하고 작은 ID를 가진 한 모든 행을 찾습니다. MYSQL 들어 이너 (EXISTS의 기능적 등가물) 조인과 같이, 사용되어야 :

    당신은 데이터를 삭제하는 상관 하위 쿼리를 할 수 있어야합니다. 중복있는 모든 삭제하고 작은 ID를 가진 한 모든 행을 찾습니다. MYSQL 들어 이너 (EXISTS의 기능적 등가물) 조인과 같이, 사용되어야 :

    delete games from games inner join 
        (select  min(id) minid, date, time,
                 hometeam_id, awayteam_id, locationcity, locationstate
         from games 
         group by date, time, hometeam_id, 
                  awayteam_id, locationcity, locationstate
         having count(1) > 1) as duplicates
       on (duplicates.date = games.date
       and duplicates.time = games.time
       and duplicates.hometeam_id = games.hometeam_id
       and duplicates.awayteam_id = games.awayteam_id
       and duplicates.locationcity = games.locationcity
       and duplicates.locationstate = games.locationstate
       and duplicates.minid <> games.id)
    

    테스트를 위해, 게임에서 선택 *와 게임에서 삭제 게임을 대체합니다. 당신의 DB에서 삭제를 실행하지 마십시오 :-)

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

    2.당신은 쿼리를 시도 할 수 있습니다 :

    당신은 쿼리를 시도 할 수 있습니다 :

    DELETE FROM table_name AS t1
    WHERE EXISTS (
     SELECT 1 FROM table_name AS t2 
     WHERE t2.date = t1.date 
     AND t2.time = t1.time 
     AND t2.hometeam_id = t1.hometeam_id 
     AND t2.awayteam_id = t1.awayteam_id 
     AND t2.locationcity = t1.locationcity 
     AND t2.id > t1.id )
    

    이 데이터베이스에 가장 작은 ID를 가지고 각 게임 인스턴스의 한 예를 떠날 것이다.

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

    3.나를 위해 일한 가장 좋은 방법은 테이블을 재 작성하는 것이 었습니다.

    나를 위해 일한 가장 좋은 방법은 테이블을 재 작성하는 것이 었습니다.

    CREATE TABLE newtable SELECT * FROM oldtable GROUP BY field1,field2;
    

    그런 다음 이름을 바꿀 수 있습니다.

  4. ==============================

    4.두 개의 필드와 일치하는 중복 된 항목의 목록을 얻으려면

    두 개의 필드와 일치하는 중복 된 항목의 목록을 얻으려면

    select t.ID, t.field1, t.field2
    from (
      select field1, field2
      from table_name
      group by field1, field2
      having count(*) > 1) x, table_name t
    where x.field1 = t.field1 and x.field2 = t.field2
    order by t.field1, t.field2
    

    그리고 모든 중복 만 삭제

    DELETE x 
    FROM table_name x
    JOIN table_name y
    ON y.field1= x.field1
    AND y.field2 = x.field2
    AND y.id < x.id;
    
  5. ==============================

    5.

    select orig.id,
           dupl.id
    from   games   orig, 
           games   dupl
    where  orig.date   =    dupl.date
    and    orig.time   =    dupl.time
    and    orig.hometeam_id = dupl.hometeam_id
    and    orig. awayteam_id = dupl.awayeam_id
    and    orig.locationcity = dupl.locationcity
    and    orig.locationstate = dupl.locationstate
    and    orig.id     <    dupl.id
    

    이것은 당신에게 중복을 제공한다 당신은 삭제 ID를 지정하는 하위 쿼리로 사용할 수 있습니다.

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

    6.AS 당신이 당신의 선택 쿼리와 다른 데이터 테이블에 ID (기본 키)를 받고하지 않는 한 중복 결과를 얻는 피하기 위해 DISTINCT SELECT 사용할 수 있습니다 정확히 동일합니다.

    AS 당신이 당신의 선택 쿼리와 다른 데이터 테이블에 ID (기본 키)를 받고하지 않는 한 중복 결과를 얻는 피하기 위해 DISTINCT SELECT 사용할 수 있습니다 정확히 동일합니다.

  7. ==============================

    7.

    delete from games 
       where id not in 
       (select max(id)  from games 
        group by date, time, hometeam_id, awayteam_id, locationcity, locationstate 
        );
    

    해결 방법

    select max(id)  id from games 
        group by date, time, hometeam_id, awayteam_id, locationcity, locationstate
    into table temp_table;
    
    delete from games where id in (select id from temp);
    
  8. ==============================

    8.

    DELETE FROM table
    WHERE id = 
        (SELECT t.id
        FROM table as t
        JOIN (table as tj ON (t.date = tj.data
                              AND t.hometeam_id = tj.hometeam_id
                              AND t.awayteam_id = tj.awayteam_id
                              ...))
    
  9. from https://stackoverflow.com/questions/6471463/how-to-delete-duplicates-in-sql-table-based-on-multiple-fields by cc-by-sa and MIT license