Donc, je veux faire quelque chose comme ce code SQL ci-dessous:
select s.id, s.name,s.city
from stuff s
group by s.name having count(where city and name are identical) > 1
Pour produire ce qui suit, (mais ignorez où seul le nom ou seulement la ville correspond, il doit être sur les deux colonnes):
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
la source
la source
name
ou l' autrecity
contient ou contientnull
, ils ne seront pas signalés dans la requête externe, mais seront mis en correspondance dans la requête interne.null
alors (sauf si je manque quelque chose), vous devez le changer enCROSS JOIN
(produit cartésien complet), puis ajouter uneWHERE
clause telle que: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))
la source
Quelque chose comme ça fera l'affaire. Je ne connais pas les performances, alors faites quelques tests.
la source
L'utilisation
count(*) over(partition by...)
fournit un moyen simple et efficace de localiser les répétitions indésirables, tout en répertoriant toutes les lignes affectées et toutes les colonnes souhaitées:Alors que les versions les plus récentes du SGBDR prennent en charge
count(*) over(partition by...)
MySQL V 8.0, des «fonctions de fenêtre» ont été introduites, comme indiqué ci-dessous (dans MySQL 8.0)db <> violon ici
la source
Un peu en retard dans le jeu sur ce post, mais j'ai trouvé ce moyen assez flexible / efficace
la source
Vous devez vous joindre à vous-même et faire correspondre le nom et la ville. Puis groupez par nombre.
la source
Étant donné une table intermédiaire avec 70 colonnes et seulement 4 représentant les doublons, ce code renverra les colonnes incriminées:
.
la source