[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.당신은 데이터를 삭제하는 상관 하위 쿼리를 할 수 있어야합니다. 중복있는 모든 삭제하고 작은 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.당신은 쿼리를 시도 할 수 있습니다 :
당신은 쿼리를 시도 할 수 있습니다 :
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.나를 위해 일한 가장 좋은 방법은 테이블을 재 작성하는 것이 었습니다.
나를 위해 일한 가장 좋은 방법은 테이블을 재 작성하는 것이 었습니다.
CREATE TABLE newtable SELECT * FROM oldtable GROUP BY field1,field2;
그런 다음 이름을 바꿀 수 있습니다.
-
==============================
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.
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.AS 당신이 당신의 선택 쿼리와 다른 데이터 테이블에 ID (기본 키)를 받고하지 않는 한 중복 결과를 얻는 피하기 위해 DISTINCT SELECT 사용할 수 있습니다 정확히 동일합니다.
AS 당신이 당신의 선택 쿼리와 다른 데이터 테이블에 ID (기본 키)를 받고하지 않는 한 중복 결과를 얻는 피하기 위해 DISTINCT SELECT 사용할 수 있습니다 정확히 동일합니다.
-
==============================
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.
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 ...))
from https://stackoverflow.com/questions/6471463/how-to-delete-duplicates-in-sql-table-based-on-multiple-fields by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQLite는 진짜를 INT로 변환 (0) | 2020.06.23 |
---|---|
[SQL] SQL 명령을 통해 MySQL의 호스트를보기 (0) | 2020.06.23 |
[SQL] 대 Varchar 인덱스는 성능 차이가 있습니까? (0) | 2020.06.23 |
[SQL] 저장된 왜 절차 빠르게 쿼리보다 (0) | 2020.06.23 |
[SQL] SQL 쿼리의 계산 실행 시간? (0) | 2020.06.23 |