Saya memiliki tabel database PostgreSQL yang disebut "user_links" yang saat ini memungkinkan bidang duplikat berikut:
year, user_id, sid, cid
Kendala yang unik saat field pertama disebut "id", namun saya sekarang mencari untuk menambahkan kendala untuk memastikan year
, user_id
, sid
dan cid
semua unik tapi saya tidak dapat menerapkan kendala karena nilai-nilai duplikat sudah ada yang melanggar kendala ini.
Apakah ada cara untuk menemukan semua duplikat?
sql
postgresql
duplicates
John
sumber
sumber
Jawaban:
Gagasan dasar akan menggunakan kueri bersarang dengan agregasi jumlah:
Anda dapat menyesuaikan klausa di mana dalam permintaan dalam untuk mempersempit pencarian.
Ada solusi lain yang bagus untuk yang disebutkan dalam komentar, (tetapi tidak semua orang membacanya):
Atau lebih pendek:
sumber
select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
Dari " Temukan baris duplikat dengan PostgreSQL " di sini adalah solusi cerdas:
sumber
SELECT * FROM ( SELECT *, LEAD(row,1) OVER () AS nextrow FROM ( SELECT *, ROW_NUMBER() OVER(w) AS row FROM tbl WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3) ) x ) y WHERE row > 1 OR nextrow > 1;
ROW_NUMBER()
denganCOUNT(*)
, dan tambahkanrows between unbounded preceding and unbounded following
setelahORDER BY id asc
DELETE ...USING
dan beberapa penyesuaian kecilAnda bisa bergabung ke tabel yang sama di bidang yang akan digandakan dan kemudian anti-bergabung di bidang id. Pilih bidang id dari alias tabel pertama (tn1) dan kemudian gunakan fungsi array_agg pada bidang id dari alias tabel kedua. Terakhir, agar fungsi array_agg berfungsi dengan baik, Anda akan mengelompokkan hasilnya berdasarkan bidang tn1.id. Ini akan menghasilkan set hasil yang berisi id dari catatan dan array dari semua id yang sesuai dengan kondisi gabungan.
Jelas, id yang akan berada dalam array duplikat untuk satu id, juga akan memiliki entri mereka sendiri di set hasil. Anda harus menggunakan set hasil ini untuk memutuskan id mana yang Anda inginkan untuk menjadi sumber 'kebenaran'. Satu catatan yang tidak boleh dihapus. Mungkin Anda bisa melakukan sesuatu seperti ini:
Memilih nomor ID terendah yang memiliki duplikat (dengan asumsi ID meningkat ke PK). Ini akan menjadi ID yang akan Anda simpan.
sumber
Untuk membuatnya lebih mudah, saya berasumsi bahwa Anda ingin menerapkan batasan unik hanya untuk tahun kolom dan kunci utama adalah kolom bernama id.
Untuk menemukan nilai duplikat yang harus Anda jalankan,
Menggunakan pernyataan sql di atas Anda mendapatkan tabel yang berisi semua tahun duplikat di tabel Anda. Untuk menghapus semua duplikat kecuali entri duplikat terbaru, Anda harus menggunakan pernyataan sql di atas.
sumber