Pertimbangkan EmployeeName
tabel bernama kolom Employee
. Tujuannya adalah untuk menghapus record berulang-ulang, berdasarkanEmployeeName
lapangan.
EmployeeName
------------
Anand
Anand
Anil
Dipak
Anil
Dipak
Dipak
Anil
Menggunakan satu kueri, saya ingin menghapus catatan yang berulang.
Bagaimana ini bisa dilakukan dengan TSQL di SQL Server?
sql
tsql
duplicates
delete-row
usr021986
sumber
sumber
empId
manakah kolom dalam contoh Anda yang digunakan oleh John?row_number() over (partition by EmployeeName order by EmployeeName)
... ini akan memilih satu rekaman acak untuk setiap nama .Jawaban:
Anda dapat melakukan ini dengan fungsi jendela. Ini akan memerintahkan dupes dengan empId, dan menghapus semua kecuali yang pertama.
Jalankan sebagai pilihan untuk melihat apa yang akan dihapus:
sumber
ORDER BY (SELECT NULL)
stackoverflow.com/a/4812038Dengan asumsi bahwa tabel Karyawan Anda juga memiliki kolom unik (
ID
dalam contoh di bawah), berikut ini akan berfungsi:Ini akan meninggalkan versi dengan ID terendah di tabel.
Edit
komentar Re McGyver - pada SQL 2012
Untuk 2008 R2 dan sebelumnya,
Untuk 2008R2 Anda harus mentransmisikan
GUID
ke tipe yang didukung olehMIN
, misalnyaSqlFiddle untuk berbagai tipe di Sql 2008
SqlFiddle untuk berbagai tipe di Sql 2012
sumber
Anda dapat mencoba sesuatu seperti berikut ini:
(ini mengasumsikan bahwa Anda memiliki bidang unik berbasis bilangan bulat)
Secara pribadi saya akan mengatakan Anda lebih baik mencoba untuk memperbaiki fakta bahwa entri duplikat ditambahkan ke database sebelum terjadi daripada sebagai operasi perbaikan pasca.
sumber
sumber
Keajaiban ekspresi tabel umum.
sumber
Mencoba
sumber
Jika Anda sedang mencari cara untuk menghapus duplikat, namun Anda memiliki kunci asing yang menunjuk ke tabel dengan duplikat, Anda dapat mengambil pendekatan berikut menggunakan kursor yang lambat namun efektif.
Ini akan merelokasi kunci duplikat pada tabel kunci asing.
sumber
sumber
Silakan lihat cara penghapusan di bawah ini juga.
Membuat tabel sampel bernama
@Employee
dan memuatnya dengan data yang diberikan.Hasil:
Saya tahu, ini ditanyakan enam tahun lalu, posting hanya jika bermanfaat bagi siapa saja.
sumber
Berikut adalah cara yang bagus untuk mendeduplikasi rekaman dalam tabel yang memiliki kolom identitas berdasarkan kunci utama yang diinginkan yang dapat Anda tentukan saat runtime. Sebelum saya mulai, saya akan mengisi kumpulan data sampel untuk digunakan menggunakan kode berikut:
Selanjutnya saya akan membuat Type yang disebut ColumnNames:
Akhirnya saya akan membuat proc yang disimpan dengan 3 peringatan berikut: 1. Proc akan mengambil parameter yang diperlukan @tablename yang menentukan nama tabel yang Anda hapus dari database Anda. 2. Proc memiliki parameter opsional @columns yang dapat Anda gunakan untuk menentukan bidang yang membentuk kunci utama yang diinginkan yang ingin Anda hapus. Jika kolom ini dibiarkan kosong, diasumsikan bahwa semua kolom selain kolom identitas merupakan kunci utama yang diinginkan. 3. Ketika catatan duplikat dihapus, catatan dengan nilai terendah di kolom identitasnya akan dipertahankan.
Ini adalah proc yang disimpan delete_dupes:
Setelah ini dipenuhi, Anda dapat menghapus semua rekaman duplikat Anda dengan menjalankan proc. Untuk menghapus dupes tanpa menentukan kunci utama yang diinginkan, gunakan panggilan ini:
Untuk menghapus dupes berdasarkan kunci utama yang diinginkan, gunakan panggilan ini:
sumber