Então, eu quero fazer algo como este código sql abaixo:
select s.id, s.name,s.city
from stuff s
group by s.name having count(where city and name are identical) > 1
Para produzir o seguinte, (mas ignore onde apenas o nome ou apenas a cidade correspondem, deve estar em ambas as colunas):
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
fonte
fonte
name
oucity
contiveremnull
, eles não serão relatados na consulta externa, mas serão correspondidos na consulta interna.null
então (a menos que esteja faltando alguma coisa), você precisa alterá-lo para umCROSS JOIN
(produto cartesiano completo) e, em seguida, adicionar umaWHERE
cláusula como: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))
fonte
Algo assim resolverá. Não sei sobre desempenho, então faça alguns testes.
fonte
O uso
count(*) over(partition by...)
fornece um meio simples e eficiente de localizar repetições indesejadas, ao mesmo tempo que lista todas as linhas afetadas e todas as colunas desejadas:Enquanto as versões mais recentes de RDBMS suportam
count(*) over(partition by...)
MySQL V 8.0 introduziu "funções de janela", como visto abaixo (no MySQL 8.0)db <> fiddle aqui
fonte
Um pouco atrasado para o jogo neste post, mas achei essa forma bastante flexível / eficiente
fonte
Você tem que se juntar a si mesmo e combinar o nome e a cidade. Em seguida, agrupe por contagem.
fonte
Dada uma tabela de teste com 70 colunas e apenas 4 representando duplicatas, este código retornará as colunas ofensivas:
.
fonte