Ao trabalhar com o SQL Server, é importante entender os diferentes tipos de junções e como eles podem afetar os resultados da sua consulta. Uma junção comumente usada é o LEFT JOIN, que permite recuperar dados de duas ou mais tabelas com base em uma condição especificada.
Em um LEFT JOIN, todas as linhas da tabela da esquerda (a tabela especificada antes da palavra-chave JOIN) são retornadas, juntamente com as linhas correspondentes da tabela da direita (a tabela especificada após a palavra-chave JOIN). Se não houver linhas correspondentes na tabela da direita, valores NULL são retornados para as colunas da tabela da direita.
Vamos considerar um exemplo para ilustrar o conceito de um LEFT JOIN. Suponha que temos duas tabelas: Funcionários e Vendas. A tabela Funcionários contém informações sobre os funcionários, incluindo seus nomes e idades. A tabela Vendas contém informações sobre as vendas feitas pelos funcionários, incluindo o ID da venda e a data da venda.
Aqui está um exemplo simples de um LEFT JOIN que retorna as estatísticas de vendas para todos os funcionários com menos de 21 anos:
SELECT e.Name, COUNT(s.SaleId) AS Vendas, MAX(s.DateOfSale) AS ÚltimaVenda
FROM Funcionários e
LEFT JOIN Vendas s ON e.IdFuncionario = s.IdFuncionario
WHERE e.Idade < 21
GROUP BY e.Name
Neste exemplo, a consulta retorna todos os funcionários com menos de 21 anos, mesmo que eles não tenham feito nenhuma venda. Os funcionários sem venda exibirão NULL nas colunas Vendas e ÚltimaVenda, pois não havia nenhuma linha para fazer a junção na tabela Vendas para esses funcionários.
No entanto, é importante ter cautela ao usar filtros com LEFT JOINs. Vamos considerar outro exemplo em que o LEFT JOIN é quebrado:
SELECT e.Name, COUNT(s.SaleId) AS Vendas, MAX(s.DateOfSale) AS ÚltimaVenda
FROM Funcionários e
LEFT JOIN Vendas s ON e.IdFuncionario = s.IdFuncionario
WHERE e.Idade < 21
AND s.DateOfSale >= CONVERT(DATE, '2016-03-01')
AND s.DateOfSale < CONVERT(DATE, '2016-04-01')
GROUP BY e.Name
Nesta consulta modificada, adicionamos um filtro para contar apenas as vendas do mês de março. No entanto, esse filtro faz com que o LEFT JOIN não funcione como pretendido. Ele retorna apenas os funcionários que fizeram uma venda em março, em vez de retornar todos os funcionários.
O problema está na colocação do filtro. Ao incluir o filtro na cláusula WHERE, estamos efetivamente convertendo o LEFT JOIN em um INNER JOIN. As linhas com valores NULL na coluna s.DateOfSale (funcionários que ainda não fizeram uma venda) são filtradas, assim como os funcionários com vendas em meses diferentes de março.
Para corrigir esse problema, podemos mover o filtro para a condição do LEFT JOIN:
SELECT e.Name, COUNT(s.SaleId) AS Vendas, MAX(s.DateOfSale) AS ÚltimaVenda
FROM Funcionários e
LEFT JOIN Vendas s ON e.IdFuncionario = s.IdFuncionario
AND s.DateOfSale >= CONVERT(DATE, '2016-03-01')
AND s.DateOfSale < CONVERT(DATE, '2016-04-01')
WHERE e.Idade < 21
GROUP BY e.Name
Ao mover o filtro para a condição do LEFT JOIN, estamos dizendo para retornar todos os funcionários (incluindo aqueles com 0 vendas) e incluir apenas as vendas que aconteceram em março.
Em conclusão, entender o comportamento dos LEFT JOINs e como os filtros podem afetar seus resultados é crucial ao trabalhar com o SQL Server. Ao estar atento à colocação dos filtros e usar os tipos de junção apropriados, você pode garantir resultados precisos e abrangentes nas consultas.
Obrigado por ler!
Entusiasta do SQL Server