Eu tenho duas tabelas que preciso juntar. No entanto, eu só quero unir registros quando houver correspondências incomuns, em vez de escolher um dos vários para a junção.
Versão:
Usando MariaDB versão 10.3.34
Dados de exemplo:
Dados principais (ESQUERDA)towns
Eu iria | Cidade | código postal |
---|---|---|
1 | Hudderfield | HD11 4ER |
2 | Manchester | MN14 3JE |
3 | Macklesfield | MK17 9FL |
4 | Edimburgo | ED5 3MJ |
5 | Liverpool | LV9 8XT |
Dados combinados (DIREITO) peoples
:
Eu iria | nomes | código postal |
---|---|---|
1 | Jimmy Saville | HD11 4ER |
2 | Jason Bomb | IP14 8FK |
3 | Mickey Mouse | MK17 9FL |
4 | Bobby Dillian | ED5 3MJ |
5 | Lenny Davies | ED5 3MJ |
Meu SQL:
Minha consulta inicial seria algo como:
SELECT towns.id, towns.town, peoples.name FROM towns
LEFT JOIN people ON towns.postcode = peoples.postcode
Mas isso incluirá, Edinburgh
mas há duas pessoas em Edimburgo, eu só quero participar quando houver uma única linha incomum para participar.
Eu uso a junção LEFT porque preciso retornar todas towns
, mas apenas as linhas exclusivas de peoples
.
Resultados esperados:
Eu iria | Cidade | nomes |
---|---|---|
1 | Hudderfield | Jimmy Saville |
2 | Manchester | <null> |
3 | Macklesfield | Mickey Mouse |
4 | Edimburgo | <null> |
5 | Liverpool | <null> |
O que eu tentei
Eu tentei usar COUNT()
no JOIN, mas não consigo fazer isso funcionar,
SELECT towns.id, towns.town, peoples.names FROM towns
LEFT JOIN people ON towns.postcode = peoples.postcode AND count(peoples.id) = 1
Apresenta um erro de sintaxe.
Não consigo pensar em como posso qualificar essa junção de que ela só se une quando há um único resultado encontrado. A pesquisa na Internet me dá muitas referências muito mais vagas e fora do tópico.
Tenho certeza que é simples, mas não consigo. Além disso, gostaria de evitar subconsultas, se possível?
Uma maneira alternativa para a resposta da função de janela de Lennart é apenas usar uma cláusula
GROUP BY
and contra a tabela para filtrar aquelas com o mesmo :HAVING
peoples
postcode
Você deve ser capaz de se juntar a pessoas com:
ou seja
EDITAR:
Dado o ddl fornecido na atualização, criei o db<>fiddle
Parece dar o resultado esperado
Ainda mais simples:
Acredito que evita o problema "somente grupo completo por" mencionado nos comentários anteriores. (Se não, veja os comentários sobre esta resposta.)
Olha, mãe, sem subconsultas e funções agregadas ou de janela!