[SQL] SQLite는 데이터베이스에서 중복 행을 삭제
SQLSQLite는 데이터베이스에서 중복 행을 삭제
나는 거대한 테이블이 - 36000000 행 - sqlite3를에 있습니다. 이 매우 큰 테이블에서 두 개의 열이 있습니다
행 중 일부는 중복입니다. 즉, 두 해시와 동일한 값을 가질 거라고. 두 해시가 일치하면, 그래서 (D)의 값이다. 그러나, 두 개의 동일한 D의 두 개의 동일한 hash'es을 의미하지는 않습니다.
나는 중복 행을 삭제합니다. 나는 기본 키 열이 없습니다.
이 작업을 수행하는 가장 빠른 방법은 무엇입니까?
해결법
-
==============================
1.당신은 행을 구별 할 수있는 방법이 필요하다. 귀하의 의견을 바탕으로, 당신은에 대한 특별한 ROWID 열을 사용할 수 있습니다.
당신은 행을 구별 할 수있는 방법이 필요하다. 귀하의 의견을 바탕으로, 당신은에 대한 특별한 ROWID 열을 사용할 수 있습니다.
(해시, D) 당 가장 낮은 ROWID를 유지하여 중복을 삭제하려면 :
delete from YourTable where rowid not in ( select min(rowid) from YourTable group by hash , d )
-
==============================
2.나는 그것이 가장 빠른이 매우 데이터베이스를 사용하는 것 같아요 같은 열이있는 새 테이블을 추가 할 수 있지만 적절한 제약 (해시 / 실제 쌍에 고유 인덱스?)와 반복, 원래의 테이블을 통해하는 것은 레코드를 삽입하려고 새 테이블 (예외가 발생하는 경우 즉 반복하는 계속) 제약 조건 위반 오류를 무시.
나는 그것이 가장 빠른이 매우 데이터베이스를 사용하는 것 같아요 같은 열이있는 새 테이블을 추가 할 수 있지만 적절한 제약 (해시 / 실제 쌍에 고유 인덱스?)와 반복, 원래의 테이블을 통해하는 것은 레코드를 삽입하려고 새 테이블 (예외가 발생하는 경우 즉 반복하는 계속) 제약 조건 위반 오류를 무시.
그런 다음 이전 테이블을 삭제하고 이전에 새로운 이름을 바꿉니다.
-
==============================
3.기본 키를 추가하는 옵션이 아닌 경우, 하나의 접근 방식은 임시 테이블에 DISTINCT 중복을 저장하는 기존 테이블에서 중복 된 기록을 모두 삭제 한 다음 임시 테이블에서 원래 테이블에 다시 레코드를 추가하는 것입니다 .
기본 키를 추가하는 옵션이 아닌 경우, 하나의 접근 방식은 임시 테이블에 DISTINCT 중복을 저장하는 기존 테이블에서 중복 된 기록을 모두 삭제 한 다음 임시 테이블에서 원래 테이블에 다시 레코드를 추가하는 것입니다 .
예를 들어 (SQL 서버 2008 용으로 작성하지만, 기술은 데이터베이스에 대해 동일)
DECLARE @original AS TABLE([hash] varchar(20), [d] float) INSERT INTO @original VALUES('A', 1) INSERT INTO @original VALUES('A', 2) INSERT INTO @original VALUES('A', 1) INSERT INTO @original VALUES('B', 1) INSERT INTO @original VALUES('C', 1) INSERT INTO @original VALUES('C', 1) DECLARE @temp AS TABLE([hash] varchar(20), [d] float) INSERT INTO @temp SELECT [hash], [d] FROM @original GROUP BY [hash], [d] HAVING COUNT(*) > 1 DELETE O FROM @original O JOIN @temp T ON T.[hash] = O.[hash] AND T.[d] = O.[d] INSERT INTO @original SELECT [hash], [d] FROM @temp SELECT * FROM @original
나는 확실하지 sqlite가이 ROW_NUMBER () 입력 기능이있는 경우 해요,하지만이하는 경우도 여기에 나열된 접근 방법의 몇 가지 시도해 볼 수도 있습니다 : 기본 키없이 SQL 테이블에서 삭제 중복 레코드를
from https://stackoverflow.com/questions/8190541/deleting-duplicate-rows-from-sqlite-database by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 스위치 / 케이스에 '어디서'절 (0) | 2020.03.31 |
---|---|
[SQL] SQL 쿼리 기존 테이블에 대한 스크립트를 생성 생성 (0) | 2020.03.31 |
[SQL] DB를 모든 테이블, 행과 열에서 문자열 검색 (0) | 2020.03.31 |
[SQL] 테이블에 MySQL의 :: 삽입, 다른 테이블에서 데이터? (0) | 2020.03.31 |
[SQL] 다른 테이블에 데이터를 복사 (0) | 2020.03.31 |