Beberapa hari yang lalu, ketika saya melakukan persyaratan, saya perlu membersihkan catatan duplikat di mysql, dan idenya saat itu adalah menulisnya melalui traversal kode, dan kemudian saya pikir itu terlalu rumit, berpikir bahwa saya harus dapat memecahkan masalah dengan pernyataan sql. Setelah memeriksa informasi dan berkonsultasi dengan bos, saya menemukan pernyataan sql yang sangat nyaman, dan di sini saya akan membagikan pernyataan dan ide sql ini.
Analisis kebutuhan
Jika ada catatan duplikat dalam database, hapus dan simpan salah satunya (apakah kriteria untuk menentukan bidang duplikat adalah beberapa bidang)
larutan
Ketika Anda menghadapi kebutuhan ini, Anda mungkin memiliki ide di hati Anda. Hal tercepat yang saya pikirkan adalah bahwa saya dapat menyelesaikannya dengan pernyataan sql, tetapi saya terlalu dangkal dalam pernyataan sql yang rumit, jadi saya ingin meminta bantuan bos.
Temukan seseorang untuk membantu
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Baidu Sendiri
Menemukan pernyataan sql:
Ide SQL ini jelas, ada 3 langkah berikut:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Kueri catatan duplikat dalam tabel sebagai kondisi
- PILIH min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Kondisi kedua adalah nilai terkecil dari ID dalam catatan duplikat dalam tabel kueri
- Terakhir, sesuai dengan dua kondisi di atas, hapus catatan duplikat yang tersisa kecuali ID terkecil dalam catatan duplikat
Namun sayangnya, ada kesalahan dalam menjalankan pernyataan ini, yang secara kasar berarti bahwa tabel tidak dapat diperbarui bersamaan dengan kueri.
Kode terpecahkan
Berdasarkan pernyataan SQL di atas, saya pikir Anda mungkin dapat mencapai tujuan yang sama dalam dua langkah melalui kode:
- Himpunan data duplikat dikeluarkan terlebih dahulu
- Berdasarkan himpunan data yang dikueri, duplikat yang tersisa dihapus dalam perulangan
Saya punya ide, dan saya menulisnya dengan cepat, tetapi saya terkejut ketika saya menjalankannya, dan saya benar-benar membutuhkannya116 detikkiri dan kanan, dan kemudian saya ingin menemukan pernyataan SQL yang dapat saya gunakan, tempelkan kode dan hasil yang berjalan:
Sempurnakan [deduplikasi dan tinggalkan satu] SQL
Akhirnya, saya mendapat jawaban yang sempurna dalam kelompok teknis, lihat pernyataan sql ini:
Pernyataan sql di atas, jika Anda melihat lebih dekat, tidak sulit untuk mengetahui idenya, dan mungkin dibagi menjadi 3 langkah untuk memahami:
- (SELECT min(id) id, user_id, moneterary, consume_time FROM consum_record GROUP BY user_id, moneterary, consume_time HAVING count(*) > 1 ) t2 Kueri catatan duplikat untuk membentuk koleksi (tabel sementara t2), yang berisi ID minimum setiap catatan duplikat
- consum_record.user_id = t2.user_id dan consum_record.monetary = t2.monetary dan consum_record.consume_time = t2.consume_time Bidang Associate untuk kriteria duplikat
- Hapus catatan dengan ID lebih besar dari ID di T2 sesuai dengan kondisi
Ketika saya melihat kalimat ini, saya berpikir dalam hati bahwa ini terlalu kuat. Pernyataan sql yang begitu sederhana dapat memecahkan masalah yang begitu kompleks, dan posturnya meningkat ~ Ini juga sangat cepat untuk dijalankan, eksekusi loop kode asli membutuhkan waktu sekitar 116 detik, tetapi di sini 0,3 detik sudah cukup, luar biasa ~
|