복붙노트

[SQL] SQLite는 데이터베이스에서 중복 행을 삭제

SQL

SQLite는 데이터베이스에서 중복 행을 삭제

나는 거대한 테이블이 - 36000000 행 - sqlite3를에 있습니다. 이 매우 큰 테이블에서 두 개의 열이 있습니다

행 중 일부는 중복입니다. 즉, 두 해시와 동일한 값을 가질 거라고. 두 해시가 일치하면, 그래서 (D)의 값이다. 그러나, 두 개의 동일한 D의 두 개의 동일한 hash'es을 의미하지는 않습니다.

나는 중복 행을 삭제합니다. 나는 기본 키 열이 없습니다.

이 작업을 수행하는 가장 빠른 방법은 무엇입니까?

해결법

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

    1.당신은 행을 구별 할 수있는 방법이 필요하다. 귀하의 의견을 바탕으로, 당신은에 대한 특별한 ROWID 열을 사용할 수 있습니다.

    당신은 행을 구별 할 수있는 방법이 필요하다. 귀하의 의견을 바탕으로, 당신은에 대한 특별한 ROWID 열을 사용할 수 있습니다.

    (해시, D) 당 가장 낮은 ROWID를 유지하여 중복을 삭제하려면 :

    delete   from YourTable
    where    rowid not in
             (
             select  min(rowid)
             from    YourTable
             group by
                     hash
             ,       d
             )
    
  2. ==============================

    2.나는 그것이 가장 빠른이 매우 데이터베이스를 사용하는 것 같아요 같은 열이있는 새 테이블을 추가 할 수 있지만 적절한 제약 (해시 / 실제 쌍에 고유 인덱스?)와 반복, 원래의 테이블을 통해하는 것은 레코드를 삽입하려고 새 테이블 (예외가 발생하는 경우 즉 반복하는 계속) 제약 조건 위반 오류를 무시.

    나는 그것이 가장 빠른이 매우 데이터베이스를 사용하는 것 같아요 같은 열이있는 새 테이블을 추가 할 수 있지만 적절한 제약 (해시 / 실제 쌍에 고유 인덱스?)와 반복, 원래의 테이블을 통해하는 것은 레코드를 삽입하려고 새 테이블 (예외가 발생하는 경우 즉 반복하는 계속) 제약 조건 위반 오류를 무시.

    그런 다음 이전 테이블을 삭제하고 이전에 새로운 이름을 바꿉니다.

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

    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 테이블에서 삭제 중복 레코드를

  4. from https://stackoverflow.com/questions/8190541/deleting-duplicate-rows-from-sqlite-database by cc-by-sa and MIT license