PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Проверете за пълни дублирани редове в голяма таблица

За да откриете дали иманякои съществува пълен дубликат (идентичен във всички колони), това е може би най-бързият начин:

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid <> t1.ctid
    )

ЕСТЕСТВЕНО СЪЕДИНЯВАНЕ е много удобна стенограма за случая, защото (цитирайки ръководството тук ):

СЪЩЕСТВУВА вероятно е най-бързият, защото Postgres спира търсенето веднага щом бъде намерен първият дубликат. Тъй като най-вероятно нямате индекс, покриващ целия ред и таблицата ви е огромна, това ще ви спести много на времето.

Имайте предвид, че NULL е никога смятан за идентичен на друг NULL . Ако имате NULL стойности и ги считате за идентични, ще трябва да направите повече.

ctid е системна колона който може да бъде (зло)използван като ad-hoc първичен ключ, но не може да замени действително дефиниран от потребителя първичен ключ в дългосрочен план.

Остарялата версия 8.1 изглежда няма <> оператор, дефиниран за ctid . Опитайте да прехвърлите към текст :

SELECT EXISTS (
    SELECT 1
    FROM   tbl t
    NATURAL JOIN tbl t1 
    WHERE  t.ctid::text <> t1.ctid::text
    )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django OperationalError:не можа да разклони нов процес за свързване

  2. postgres - с рекурсивно

  3. Внедряване на история на таблицата на PostgreSQL

  4. Имате нужда от бърз метод за преобразуване на голямо количество double в низ

  5. SQL групови стойности за една колона по друга колона