Faz muito tempo que usamos junções na linguagem SQL (ou JOINs), mas isso sempre causa dúvidas – mesmo em desenvolvedores experientes. Eu tenho um amigo fera em C# que sempre que ele tem que criar um relatório mais sofisticado, ele me pede umas dicas.
Você até pode pensar que JOIN é coisa trivial, mas quando se tem um relatório realmente complexo para fazer, nem sempre é muito claro pro desenvolvedor se um determinado cálculo precisa ser feito como subconsulta ou se o correto é criar um JOIN primeiro e fazer um cálculo mais simples em seguida. É muito comum que isso aconteça, principalmente nos casos em que se trabalha com agrupamentos de dados (GROUP BY).
Como regra geral, eu considero que a melhor abordagem é sempre criar junções das tabelas antes de se partir para os cálculos.
O que complica mais as coisas é que nestes relatórios complexos, muitas vezes, se usa mais de um tipo de junção, por exemplo INNER JOIN e também LEFT JOIN. O segredo para se entender isso é conhecer as propriedades dos tipos de JOIN (obviamente) e tratar caso a caso a junção de cada par de tabelas.
Em 2009, eu publiquei na comunidade SQL Server Central o artigo SQL and the JOIN Operator, que acabou sendo republicado pelo editor em 2011. Neste artigo, eu mostro os vários tipos de JOINs suportados na linguagem SQL e uso diagramas de Venn para ilustrar como é a “cara” dos resultados destes JOINs.
Nos diagramas a seguir, os círculos representam as tabelas e as áreas vermelhas mostram o resultado de cada tipo de JOIN. Caso você tenha dúvidas ou queira saber mais detalhes, recomendo dar uma olhada no meu artigo, que é gratuito.
OBS: Eu vi a pouco tempo rolando no Facabook uma imagem parecida com esta que eu mostro aqui. Na época que eu escrevi o artigo, eu procurei na internet alguma publicação que mostrasse todos estes tipos de JOINs juntos para que eu a citasse na bibliografia, mas acabei não achando nenhum artigo ou livro do gênero. Mas parece que o artigo do C.L. Moffatt realmente foi publicado antes do meu.