Bagaimana saya bisa menghapus baris duplikat di mana tidak unique row id
ada?
Meja saya
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Saya ingin diberi yang berikut setelah penghapusan duplikat:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Saya sudah mencoba beberapa pertanyaan tetapi saya pikir mereka bergantung pada memiliki id baris karena saya tidak mendapatkan hasil yang diinginkan. Sebagai contoh:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
mysql
sql
sql-server-2008
duplicates
sql-delete
Fearghal
sumber
sumber
Jawaban:
Saya suka CTE dan
ROW_NUMBER
karena keduanya digabungkan memungkinkan kami untuk melihat baris mana yang dihapus (atau diperbarui), oleh karena itu ubah sajaDELETE FROM CTE...
keSELECT * FROM CTE
:DEMO (hasilnya berbeda; saya berasumsi bahwa itu karena kesalahan ketik di pihak Anda)
Contoh ini menentukan duplikat oleh satu kolom
col1
karenaPARTITION BY col1
. Jika Anda ingin memasukkan beberapa kolom, cukup tambahkan kePARTITION BY
:sumber
AND COl1='John'
). Biasanya Anda harus menerapkan filter di CTE....FROM dbo.Table1 WHERE Col1='John'
. Ini biola: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
seperti yang terlihat di siniSaya lebih suka CTE untuk menghapus duplikat baris dari tabel sql server
sangat menyarankan untuk mengikuti artikel ini :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
sumber
Tanpa menggunakan
CTE
danROW_NUMBER()
Anda hanya dapat menghapus catatan hanya dengan menggunakan grup denganMAX
fungsi di sini adalah dan contohsumber
MIN(ID)
sumber
Silakan lihat cara penghapusan di bawah ini juga.
Membuat tabel sampel bernama
@table
dan memuatnya dengan data yang diberikan.Catatan: Jika Anda memberikan semua kolom di
Partition by
bagian tersebut, makaorder by
tidak memiliki banyak arti.Saya tahu, pertanyaan itu ditanyakan tiga tahun lalu, dan jawaban saya adalah versi lain dari apa yang telah diposting Tim, Tetapi memposting hanya jika itu membantu bagi siapa pun.
sumber
Jika Anda tidak memiliki referensi, seperti kunci asing, Anda dapat melakukan ini. Saya sering melakukannya ketika menguji bukti konsep dan data uji diduplikasi.
Pergilah ke objek explorer dan hapus tabel lama.
Ganti nama tabel baru dengan nama tabel lama.
sumber
Microsoft memiliki panduan yang sangat rapi tentang cara menghapus duplikat. Lihat http://support.microsoft.com/kb/139444
Secara singkat, berikut adalah cara termudah untuk menghapus duplikat ketika Anda hanya memiliki beberapa baris untuk dihapus:
myprimarykey adalah pengidentifikasi untuk baris.
Saya menetapkan rowcount ke 1 karena saya hanya memiliki dua baris yang digandakan. Jika saya memiliki 3 baris digandakan maka saya akan menetapkan rowcount ke 2 sehingga menghapus dua yang pertama yang dilihatnya dan hanya menyisakan satu di tabel t1.
Semoga ini bisa membantu siapa saja
sumber
Coba Gunakan:
sumber
Setelah mencoba solusi yang disarankan di atas, itu berfungsi untuk tabel menengah kecil. Saya dapat menyarankan solusi untuk tabel yang sangat besar. karena berjalan di iterasi.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
lagi, tapi sekarang, tambahkan kunci utama dengan semua kolom yang menentukan penambahan duplikasiWITH (IGNORE_DUP_KEY = ON)
Sebagai contoh:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Buat lagi tampilan yang Anda jatuhkan di tempat pertama untuk tabel yang baru dibuat
Sekarang, Jalankan skrip sql berikut, Anda akan melihat hasilnya dalam 1.000.000 baris per halaman, Anda dapat mengubah nomor baris per halaman untuk melihat hasilnya lebih sering.
Perhatikan, bahwa saya mengatur
IDENTITY_INSERT
on dan off karena satu kolom berisi id tambahan otomatis, yang juga saya salinSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
sumber
Ada dua solusi di
mysql
:A) Hapus duplikat baris menggunakan
DELETE JOIN
pernyataanKueri ini merujuk tabel kontak dua kali, oleh karena itu, ia menggunakan alias tabel
t1
dant2
.Outputnya adalah:
Jika Anda ingin menghapus duplikat baris dan menyimpannya
lowest id
, Anda dapat menggunakan pernyataan berikut:B) Hapus baris duplikat menggunakan tabel perantara
Berikut ini menunjukkan langkah-langkah untuk menghapus baris duplikat menggunakan tabel perantara:
1. Buat tabel baru dengan struktur yang sama dengan tabel asli yang ingin Anda hapus baris duplikat.
2. Masukkan baris berbeda dari tabel asli ke tabel langsung.
3. Masukkan baris berbeda dari tabel asli ke tabel langsung.
Langkah 1. Buat tabel baru yang strukturnya sama dengan tabel asli:
Langkah 2. Masukkan baris berbeda dari tabel asli ke tabel baru:
Langkah 3. jatuhkan tabel asli dan ganti nama tabel langsung ke yang asli
Sumber: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
sumber
sumber
Anda perlu mengelompokkan berdasarkan catatan duplikat menurut bidang, lalu tahan salah satu catatan dan hapus sisanya. Sebagai contoh:
sumber
Menghapus duplikat dari tabel besar (beberapa juta catatan) mungkin memakan waktu lama. Saya menyarankan Anda melakukan memasukkan massal ke tabel temp dari baris yang dipilih daripada menghapus.
sumber
Ini dapat dilakukan dengan banyak cara di sql server cara paling sederhana untuk melakukannya adalah: Masukkan baris yang berbeda dari tabel baris duplikat ke tabel sementara baru. Kemudian hapus semua data dari tabel baris duplikat kemudian masukkan semua data dari tabel sementara yang tidak memiliki duplikat seperti yang ditunjukkan di bawah ini.
Hapus baris duplikat menggunakan Common Table Expression (CTE)
sumber
sumber
Dengan merujuk ke https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
Gagasan untuk menghapus duplikat melibatkan
Selangkah demi selangkah
sumber
Jika Anda memiliki kemampuan untuk menambahkan kolom ke tabel sementara, ini adalah solusi yang berfungsi untuk saya:
Kemudian lakukan DELETE menggunakan kombinasi MIN dan GROUP BY
Verifikasi bahwa DELETE dilakukan dengan benar:
Hasilnya seharusnya tidak memiliki baris dengan jumlah lebih besar dari 1. Akhirnya, hapus kolom rowid:
sumber
Cara lain untuk menghapus baris yang telah dipublikasikan tanpa kehilangan informasi dalam satu langkah adalah seperti berikut:
sumber
Oh wow, saya merasa sangat bodoh dengan menyiapkan semua jawaban ini, mereka seperti jawaban para ahli dengan semua CTE dan tabel sementara dan lain-lain
Dan semua yang saya lakukan untuk membuatnya berfungsi hanyalah mengumpulkan kolom ID dengan menggunakan MAX.
CATATAN: Anda mungkin perlu menjalankannya beberapa kali untuk menghapus duplikat karena ini hanya akan menghapus satu set duplikat baris sekaligus.
sumber
sumber
sumber