Saya menguji sesuatu di Oracle dan mengisi tabel dengan beberapa sampel data, tetapi dalam prosesnya saya secara tidak sengaja memuat rekaman duplikat, jadi sekarang saya tidak dapat membuat kunci utama menggunakan beberapa kolom.
Bagaimana saya bisa menghapus semua baris duplikat dan hanya menyisakan satu dari mereka?
sql
oracle
duplicates
delete-row
juan
sumber
sumber
Dari Ask Tom
(memperbaiki tanda kurung yang hilang)
sumber
Dari DevX.com :
Di mana kolom1, kolom2, dll adalah kunci yang ingin Anda gunakan.
sumber
sumber
Solusi 1)
Solusi 2)
Solusi 3)
sumber
buat tabel t2 sebagai pilih berbeda * dari t1;
sumber
distinct *
akan mengambil setiap catatan yang berbeda setidaknya dalam 1 simbol dalam 1 kolom. Yang Anda butuhkan hanyalah memilih nilai yang berbeda hanya dari kolom yang ingin Anda buat kunci utama - Jawaban Bill adalah contoh yang bagus untuk pendekatan ini.Anda harus melakukan blok pl / sql kecil menggunakan kursor untuk loop dan menghapus baris yang tidak ingin Anda pertahankan. Misalnya:
sumber
Untuk memilih duplikat hanya format kueri yang bisa:
Jadi permintaan yang benar sesuai saran lainnya adalah:
Kueri ini akan menyimpan catatan tertua di database untuk kriteria yang dipilih di
WHERE CLAUSE
.Oracle Certified Associate (2008)
sumber
Cara tercepat untuk tabel yang sangat besar
Buat tabel pengecualian dengan struktur di bawah ini: exceptionions_table
Coba buat batasan unik atau kunci utama yang akan dilanggar oleh duplikat. Anda akan mendapatkan pesan kesalahan karena Anda memiliki duplikat. Tabel pengecualian akan berisi baris baris untuk baris duplikat.
Gabung meja Anda dengan exceptionionsable dengan rowid dan hapus dups
Jika jumlah baris yang akan dihapus besar, lalu buat tabel baru (dengan semua hibah dan indeks) anti-bergabung dengan exceptionions_table dengan rowid dan ganti nama tabel asli menjadi tabel original_dups dan ganti nama new_table_with_no_dups menjadi tabel asli
sumber
Menggunakan rowid-
Menggunakan self join-
sumber
Solusi 4)
sumber
1. solusi
2. sloution
3. solusi
4. solusi
sumber
5. solusi
sumber
dan Anda juga dapat menghapus rekaman duplikat dengan cara lain
sumber
sumber
sumber
sumber
Untuk kinerja terbaik, inilah yang saya tulis:
(lihat rencana eksekusi)
sumber
Periksa skrip di bawah ini -
1.
2.
3.
Anda akan melihat di sini 6-catatan.
4. lari di bawah permintaan -
select * from test;
Anda akan melihat bahwa rekaman duplikat telah dihapus.
Semoga ini bisa memecahkan pertanyaan Anda. Terima kasih :)
sumber
Saya tidak melihat jawaban apa pun yang menggunakan ekspresi tabel umum dan fungsi jendela. Inilah yang menurut saya paling mudah untuk dikerjakan.
Sesuatu yang perlu diperhatikan:
1) Kami hanya memeriksa duplikasi pada bidang dalam klausa partisi.
2) Jika Anda memiliki beberapa alasan untuk memilih satu duplikat daripada yang lain, Anda dapat menggunakan pesanan dengan klausa untuk membuat baris tersebut memiliki row_number () = 1
3) Anda dapat mengubah jumlah duplikat yang disimpan dengan mengubah klausa tempat final ke "Di mana RN> N" dengan N> = 1 (saya berpikir N = 0 akan menghapus semua baris yang memiliki duplikat, tetapi hanya akan menghapus semua baris) .
4) Menambahkan bidang Sum partisi kueri CTE yang akan menandai setiap baris dengan baris nomor dalam grup. Jadi untuk memilih baris dengan duplikat, termasuk item pertama gunakan "WHERE cnt> 1".
sumber
sumber
solusi:
sumber