Estou desembaraçando alguns códigos legados e nunca em todos os meus anos vi isso:
Select *
FROM GLAccounts
INNER JOIN GLCharts
ON glaGLChartID = glcGLChartID
LEFT JOIN GLCategories
ON glcGLCategoryID = gltGLCategoryID
INNER JOIN GLDepartments
ON glaGLDepartmentID = gldGLDepartmentID
INNER JOIN GLDivisions
ON glaGLDivisionID = glvGLDivisionID
,GLFiscalYearPeriods --<this comma>
INNER JOIN GLFiscalYears
ON glfGLFiscalYearID = glzGLFiscalYearID
ORDER BY glcGLCategoryID
,glcParentGLChartID
,glaGLChartID
a junção funciona, mas não encontro esse uso de vírgula em nenhuma referência de sintaxe T-SQL para a cláusula ON.
O que está acontecendo aqui? TIA
GLFiscalYearPeriods é uma tabela e esta vírgula implica uma junção cruzada. (Produto cartesiano)
Parece que a consulta retorna alguns valores para cada ano fiscal.
Dadas essas tabelas:
db<>fique aqui
Só mais um exemplo:
mas se você fizer a junção cruzada:
db<>fique aqui
Você conhece essa abordagem de junção?
Se você deixar a cláusula WHERE fora dessa consulta, obterá o produto cartesiano, que é o mesmo que um CROSS JOIN:
Sua consulta parece combinar essa abordagem de junção com a sintaxe INNER JOIN. É logicamente igual a isto:
Aqui está um exemplo:
Devoluções:
A sintaxe de vírgula para a junção é uma sintaxe mais antiga no padrão ANSI SQL (SQL-89 eu acho, mas posso estar errado) que foi atualizado posteriormente (SQL-92 eu acho, novamente pode estar errado) para usar uma sintaxe mais explícita que também ficou mais legível. É conhecido como 'notação de junção implícita', em contraste com as cláusulas JOIN reais que são 'notação de junção explícita'.
A sintaxe de vírgula implica uma junção implícita em vez de uma junção explícita, por exemplo, em seu código de exemplo sem uma cláusula WHERE, a sintaxe de vírgula implica um CROSS JOIN para produzir um produto cartesiano de todas as linhas em ambos os lados do JOIN.
No padrão SQL preferencial, você usaria uma cláusula CROSS JOIN de notação explícita para produzir o JOIN.
Links:
Junte-se (SQL)
Como faço um JOIN na sintaxe ANSI SQL 89?