Je me faufile du code hérité et je n'ai jamais vu cela:
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
la jointure fonctionne, mais je ne trouve pas cette utilisation d'une virgule dans une référence de syntaxe T-SQL pour la clause ON.
Qu'est-ce qu'il se passe ici? Tia
Vous savez cette approche de jointure?
SELECT *
FROM table1, table2
WHERE table1.pk = table2.fk
Si vous quittez la clause de cette requête, vous obtenez le produit cartésien, qui est identique à une jointure croisée:
SELECT *
FROM table1
CROSS JOIN table2
Votre requête a l'air de combiner une approche de jointure avec la syntaxe de jointure intérieure. Il est logiquement la même chose que ceci:
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
CROSS JOIN GLFiscalYearPeriods
INNER JOIN GLFiscalYears
ON glfGLFiscalYearID = glzGLFiscalYearID
Voici un exemple:
DECLARE @t1 TABLE (t1id INT)
DECLARE @t2 TABLE (t2id INT, t1id INT)
DECLARE @t3 TABLE (t3id INT)
INSERT INTO @t1 VALUES (1), (2)
INSERT INTO @t2 VALUES (1, 1), (2, 1), (3, 2), (4, 2)
INSERT INTO @t3 VALUES (5), (6)
SELECT *
FROM @t1
INNER JOIN @t2 ON [@t2].t1id = [@t1].t1id
, @t3
Retour:
t1id t2id t1id t3id
1 1 1 5
1 1 1 6
1 2 1 5
1 2 1 6
2 3 2 5
2 3 2 6
2 4 2 5
2 4 2 6
La syntaxe des virgules de la jointure est une syntaxe plus ancienne dans la norme ANSI SQL (SQL-89, je pense, mais je pouvais me tromper) qui a été mise à jour ultérieurement (SQL-92, je pense, encore une fois pourraient être fausses) d'utiliser une syntaxe plus explicite qui était aussi plus lisible. Il est connu sous le nom de "notation de jointure implicite", contrastée avec des clauses de jointure réelles qui sont "notation de jointure explicite".
La syntaxe des virgules implique une jointe implicite plutôt que d'une jointure explicite, par exemple dans votre code d'échantillon sans une clause où, la syntaxe des virgules implique une jointure croisée pour produire un produit cartésien de toutes les lignes des deux côtés de la jointure.
Dans la norme SQL préférée, vous utiliseriez une clause de jointure croisée de notation explicite pour produire la jointure.
Liens:
Comment puis-je faire une jointure dans la syntaxe ANSI SQL 89?