Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Diferença entre UNION com ou sem DISTINCT

Não entendi por que o instrutor usa DISTINCT, quando o UNION já faz o DISTINCT. Pelo menos assim me pareceu, pelos resultados destas duas consultas, que são iguais:

SELECT DISTINCT BAIRRO FROM tabela_de_clientes UNION SELECT DISTINCT BAIRRO FROM TABELA_DE_VENDEDORES

SELECT BAIRRO FROM tabela_de_clientes union SELECT BAIRRO FROM tabela_de_vendedores

Na verdade também pela lógica não parece fazer sentido. Senão não seria preciso o UNION ALL pra trazer também o que é repetido.

E na verdade, pela lógica (não sei se do SQL, mas pelo a minha, rs) não adiantaria, pra não trazer resultados duplicados, fazer DISTINCT em cada consulta. O UNION já faz um DISTINCT no resultado final da consulta.

Reforçando esse argumento há o fato de que os resultados das duas consultas abaixo são diferentes. A primeira traz 19 resultados, e a segunda, 14.

SELECT BAIRRO FROM tabela_de_clientes union all SELECT BAIRRO FROM tabela_de_vendedores;

SELECT DISTINCT BAIRRO FROM tabela_de_clientes UNION ALL SELECT DISTINCT BAIRRO FROM TABELA_DE_VENDEDORES

Estou certo, ou me escapou alguma coisa?

3 respostas
solução!

Boa lógica Bruno. O comportamento correto é esse mesmo. Ao meu ver, a melhor escolha é o comando simples e usando apenas o UNION.

Analisando a performance: Para o caso "Union" X "Union All com distinct", o Union vence! veja: https://stackoverflow.com/questions/35627923/union-versus-select-distinct-and-union-all-performance

Agora, para classificarmos a performance do Union com distinct nas SQLs em relação ao Union simples, precisamos realizar uma análise, como a que foi feita neste post Stack. Depende muito do volume de dados, se os registros possuem muita repetição ou não...

Olá Bruno, tudo bem? Analise muito legal, a resposta do Euler esclareceu sua dúvida Bruno? Se não, é só falar que estamos aqui pra ajudar!

Entendi, Euler. Muito interessante ver como tem outras questões envolvidas, como a performance.

Então na minha query se faz isso: 1) Une as tabelas 2) Elimina as duplicatas.

Na query do instrutor: 1) Elimina as duplicatas da primeira tabela, com o DISTINCT. 2) Elimina as duplicatas da segunda tabela, com o DISTINCT. 3) Junta as duas tabelas, já reduzidas. 4) Elimina as duplicatas da união, que ainda podem existir, com o próprio UNION.

Na verdade, no artigo não se cogita a solução apresentada na aula, de fazer o DISTINCT com o UNION. Como no artigo, se unem mais de uma tabela, eles dão duas opções: A) Fazer as junções de tabela com os UNION removendo as duplicatas à medida que as tabelas são unidas. B) Fazer as junções das tabelas com os UNION ALL, e pôr o resultado como uma subconsulta de um SELECT onde, aí sim, se põe um DISTINCT, economizando o trabalho de eliminar as duplicatas a cada junção de tabela. Mas entendo que isso pode gerar um tabelão, se os registros forem muitos, e prejudicar a performance.

Ótima a discussão. Obrigado, Euler!