복붙노트

[SQL] 삭제 중복 행 (모든 중복을 삭제하지 마십시오)

SQL

삭제 중복 행 (모든 중복을 삭제하지 마십시오)

나는 포스트 그레스를 사용하고 있습니다. 나는 중복 행을 삭제합니다. 조건은 중복 행의 세트에서 한 복사본이 삭제되지 않을 것이다.

즉 : 다음 중 4 삭제됩니다 5 개 중복 레코드가있는 경우.

해결법

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

    1.이 문서에 설명 된 단계를 시도하십시오 PostgreSQL 데이터베이스에서 중복 제거.

    이 문서에 설명 된 단계를 시도하십시오 PostgreSQL 데이터베이스에서 중복 제거.

    당신은 그룹화 할 수없는 엄청난 양의 데이터를 처리 할 때 상황을 설명합니다.

    간단한 솔루션이 될 것입니다 :

    DELETE FROM foo
           WHERE id NOT IN (SELECT min(id) --or max(id)
                            FROM foo
                            GROUP BY hash)
    

    어디 해시 중복됩니다 무언가이다.

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

    2.

    delete from table
    where not id in 
    (select max(id) from table group by [duplicate row])
    

    이것은 당신이 계속해야 행 임의 (최대 값) 선택입니다. 당신이 aggre이있는 경우이 자세한 내용을 제공하십시오 오순절

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

    3.가장 빠른는이 같은 테이블에 조인. http://www.postgresql.org/docs/8.1/interactive/sql-delete.html

    가장 빠른는이 같은 테이블에 조인. http://www.postgresql.org/docs/8.1/interactive/sql-delete.html

    CREATE TABLE test(id INT,id2 INT);
    CREATE TABLE
    mapy=# INSERT INTO test VALUES(1,2);
    INSERT 0 1
    mapy=# INSERT INTO test VALUES(1,3);
    INSERT 0 1
    mapy=# INSERT INTO test VALUES(1,4);
    INSERT 0 1
    
    DELETE FROM test t1 USING test t2 WHERE t1.id=t2.id AND t1.id2<t2.id2;
    DELETE 2
    mapy=# SELECT * FROM test;
     id | id2 
    ----+-----
      1 |   4
    (1 row)
    
  4. ==============================

    4.

    delete from table t1 
    where rowid > (SELECT min(rowid) FROM table t2 group by 
                   t2.id,t2.name );
    
  5. from https://stackoverflow.com/questions/3777633/delete-duplicate-rows-dont-delete-all-duplicate by cc-by-sa and MIT license