PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Periksa baris duplikat lengkap dalam tabel besar

Untuk mengetahui apakah ada duplikat penuh ada (identik di semua kolom), ini mungkin cara tercepat:

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

NATURAL JOIN adalah singkatan yang sangat nyaman untuk kasus ini karena (mengutip manualnya di sini ):

EXISTS mungkin tercepat, karena Postgres berhenti mencari segera setelah duplikat pertama ditemukan. Karena kemungkinan besar Anda tidak memiliki indeks yang mencakup seluruh baris dan tabel Anda sangat besar, ini akan menghemat banyak waktu.

Ketahuilah bahwa NULL adalah tidak pernah dianggap identik dengan NULL lainnya . Jika Anda memiliki NULL nilai dan menganggapnya identik, Anda harus berbuat lebih banyak.

ctid adalah kolom sistem yang dapat (ab-)digunakan sebagai kunci utama ad-hoc, tetapi tidak dapat menggantikan kunci utama yang ditentukan pengguna dalam jangka panjang.

Versi 8.1 yang sudah ketinggalan zaman tampaknya tidak memiliki <> operator yang ditentukan untuk ctid . Coba transmisikan ke text :

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. Salin tabel (termasuk indeks) di postgres

  2. Nonaktifkan DELETE di atas meja di PostgreSQL?

  3. Skrip Bash untuk menginstal PostgreSQL - Tidak berfungsi

  4. bagaimana cara melakukan kurang dari atau sama dengan dan lebih besar dari sama dengan di filter Django?

  5. PostgresQL SQL:Mengonversi hasil ke array