A sintaxe antiga, com apenas a listagem das tabelas e o uso da WHERE
cláusula para especificar os critérios de junção, está sendo preterida na maioria dos bancos de dados modernos.
Não é apenas para mostrar, a sintaxe antiga tem a possibilidade de ser ambígua quando você usa junções INNER e OUTER na mesma consulta.
Deixe-me lhe dar um exemplo.
Vamos supor que você tenha 3 tabelas no seu sistema:
Company
Department
Employee
Cada tabela contém várias linhas, vinculadas. Você tem várias empresas e cada empresa pode ter vários departamentos e cada departamento pode ter vários funcionários.
Ok, agora você quer fazer o seguinte:
Liste todas as empresas e inclua todos os seus departamentos e todos os seus funcionários. Observe que algumas empresas ainda não têm departamentos, mas inclua-os também. Recupere apenas os departamentos que possuem funcionários, mas sempre liste todas as empresas.
Então você faz isso:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
Observe que o último existe uma junção interna, para atender aos critérios de que você deseja apenas departamentos com pessoas.
Ok, então o que acontece agora. Bem, o problema é que depende do mecanismo do banco de dados, do otimizador de consulta, índices e estatísticas da tabela. Deixe-me explicar.
Se o otimizador de consultas determinar que a maneira de fazer isso é primeiro contratar uma empresa, encontrar os departamentos e fazer uma junção interna com os funcionários, você não terá empresas que não tenham departamentos.
A razão para isso é que a WHERE
cláusula determina quais linhas terminam no resultado final, não partes individuais das linhas.
E, nesse caso, devido à junção esquerda, a coluna Department.ID será NULL e, portanto, quando se trata de INNER JOIN to Employee, não há como atender a essa restrição para a linha Employee e, portanto, não aparecer.
Por outro lado, se o otimizador de consultas decidir atacar a junção departamento-funcionário primeiro e depois fazer uma junção esquerda com as empresas, você as verá.
Portanto, a sintaxe antiga é ambígua. Não há como especificar o que você deseja, sem lidar com dicas de consulta, e alguns bancos de dados não têm como.
Digite a nova sintaxe, com isso você pode escolher.
Por exemplo, se você deseja todas as empresas, como a descrição do problema afirmou, é isso que você escreveria:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
Aqui você especifica que deseja que a junção departamento-funcionário seja feita como uma junção e, em seguida, deixa a junção dos resultados disso com as empresas.
Além disso, digamos que você queira apenas departamentos que contenham a letra X em seus nomes. Novamente, com as junções de estilo antigo, você corre o risco de perder a empresa também, se ela não tiver departamentos com um X no nome, mas com a nova sintaxe, você poderá fazer o seguinte:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
Essa cláusula extra é usada para a união, mas não é um filtro para a linha inteira. Portanto, a linha pode aparecer com informações da empresa, mas pode ter NULLs em todas as colunas de departamento e funcionário dessa linha, porque não há departamento com um X no nome dessa empresa. Isso é difícil com a sintaxe antiga.
É por isso que, entre outros fornecedores, a Microsoft descontinuou a sintaxe de junção externa antiga, mas não a sintaxe de junção interna antiga, desde o SQL Server 2005 e superior. A única maneira de conversar com um banco de dados em execução no Microsoft SQL Server 2005 ou 2008, usando a sintaxe de junção externa do estilo antigo, é defini-lo no modo de compatibilidade 8.0 (também conhecido como SQL Server 2000).
Além disso, da maneira antiga, jogando várias tabelas no otimizador de consultas, com várias cláusulas WHERE, era semelhante a dizer "aqui está você, faça o melhor que puder". Com a nova sintaxe, o otimizador de consulta tem menos trabalho a fazer para descobrir quais partes estão juntas.
Então aí está.
ESQUERDA e INTERIOR JOIN é a onda do futuro.