Saya memiliki tabel dalam database PostgreSQL 8.3.8, yang tidak memiliki kunci / batasan di atasnya, dan memiliki beberapa baris dengan nilai yang persis sama.
Saya ingin menghapus semua duplikat dan hanya menyimpan 1 salinan untuk setiap baris.
Ada satu kolom khusus (bernama "kunci") yang dapat digunakan untuk mengidentifikasi duplikat (yaitu, hanya boleh ada satu entri untuk setiap "kunci" yang berbeda).
Bagaimana saya bisa melakukan ini? (Idealnya dengan satu perintah SQL) Kecepatan tidak menjadi masalah dalam kasus ini (hanya ada beberapa baris).
sql
postgresql
duplicates
André Morujão
sumber
sumber
Solusi yang lebih cepat adalah
sumber
ctid
?Ini cepat dan ringkas:
Lihat juga jawaban saya di Cara menghapus baris duplikat tanpa pengenal unik yang menyertakan lebih banyak informasi.
sumber
ctid
menunjuk ke lokasi fisik rekaman dalam tabel. Bertentangan dengan apa yang saya tulis pada saat di komentar, menggunakan kurang dari operator tidak selalu mengarah ke versi yang lebih lama karena ct dapat membungkus dan nilai dengan ctid yang lebih rendah mungkin sebenarnya lebih baru.min(ctid)
? sedangkan milikmu menyimpan yang lebih baru? Terima kasih!Saya mencoba ini:
disediakan oleh Postgres wiki:
https://wiki.postgresql.org/wiki/Deleting_duplicates
sumber
id
disertakan.id
mana kolom1 ... 3 adalah duplikatSaya harus membuat versi saya sendiri. Versi yang ditulis oleh @a_horse_with_no_name terlalu lambat di tabel saya (21 juta baris). Dan @rapimo sama sekali tidak menghapus dups.
Inilah yang saya gunakan di PostgreSQL 9.5
sumber
Saya akan menggunakan tabel sementara:
Kemudian, hapus
tab
dan ganti namatab_temp
menjaditab
.sumber
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
Pendekatan lain (hanya berfungsi jika Anda memiliki bidang unik seperti
id
di tabel Anda) untuk menemukan semua id unik menurut kolom dan menghapus id lain yang tidak ada dalam daftar uniksumber
Bagaimana tentang:
Saya khawatir tentang urutan eksekusi, apakah DELETE akan terjadi sebelum SELECT DISTINCT, tetapi berfungsi dengan baik untuk saya. Dan memiliki bonus tambahan karena tidak memerlukan pengetahuan apa pun tentang struktur tabel.
sumber
json
), ini tidak akan berfungsi.Ini bekerja dengan baik untuk saya. Saya memiliki tabel, istilah, yang berisi nilai duplikat. Menjalankan kueri untuk mengisi tabel temp dengan semua baris duplikat. Lalu saya menjalankan pernyataan delete dengan id tersebut di tabel temp. nilai adalah kolom yang berisi duplikat.
sumber
Berikut solusinya dengan menggunakan
PARTITION BY
:sumber