web-dev-qa-db-fra.com

Strange Inscrit sur la clause T-SQL

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

18
Joseph Shirk

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
7
Max Szczurek

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:

Joindre (SQL)

Comment puis-je faire une jointure dans la syntaxe ANSI SQL 89?

5
HandyD