Jadi saya ingin melakukan sesuatu seperti kode sql di bawah ini:
select s.id, s.name,s.city
from stuff s
group by s.name having count(where city and name are identical) > 1
Untuk menghasilkan berikut ini, (tapi abaikan di mana hanya nama atau hanya kota yang cocok, itu harus di kedua kolom):
id name city
904834 jim London
904835 jim London
90145 Fred Paris
90132 Fred Paris
90133 Fred Paris
sql
sql-server
sql-server-2008
duplicates
NimChimpsky
sumber
sumber
name
ataucity
berisinull
, maka mereka akan gagal dilaporkan di kueri luar, tetapi akan dicocokkan di kueri dalam.null
maka (kecuali saya kehilangan sesuatu) Anda perlu mengubahnya menjadiCROSS JOIN
(produk Cartesian lengkap) dan kemudian menambahkanWHERE
klausa seperti:WHERE ((s.name = t.name) OR (s.name is null and t.name is null)) AND ((s.city = t.city) OR (s.city is null and t.city is null))
sumber
Sesuatu seperti ini akan berhasil. Tidak tahu tentang kinerja, jadi lakukan beberapa tes.
sumber
Menggunakan
count(*) over(partition by...)
menyediakan cara yang sederhana dan efisien untuk menemukan pengulangan yang tidak diinginkan, sementara juga mencantumkan semua baris yang terpengaruh dan semua kolom yang diinginkan:Sementara versi RDBMS terbaru mendukung
count(*) over(partition by...)
MySQL V 8.0 memperkenalkan "fungsi jendela", seperti yang terlihat di bawah ini (di MySQL 8.0)db <> biola di sini
sumber
Agak terlambat untuk permainan di posting ini, tetapi saya menemukan cara ini cukup fleksibel / efisien
sumber
Anda harus menggabungkan diri sendiri dan mencocokkan nama dan kota. Kemudian kelompokkan menurut hitungan.
sumber
Diberikan tabel pementasan dengan 70 kolom dan hanya 4 yang mewakili duplikat, kode ini akan mengembalikan kolom yang melanggar:
.
sumber