1
votes

Une jointure SQL peut-elle avoir une clause on non pas immédiatement après la jointure, mais plus tard dans la requête?

J'ai posé ces questions lorsque je cherchais à modéliser les données en fonction des vues. Les requêtes sont similaires à l'exemple ci-dessous. Comme je le comprends, la jointure SQL sera suivie de la clause ON. Ici, les jointures ne sont pas immédiatement suivies de la clause ON. Et quand j'ai exécuté ces vues, elles fonctionnent très bien sur la base de données, donnant le jeu de données de résultat. Quelqu'un peut-il expliquer cette requête s'il vous plaît?

Select *
FROM B  
INNER JOIN C     
INNER JOIN D  
ON C.c_id = D.d_id   
INNER JOIN E   
ON C.c_id = E.e_id  
INNER JOIN F   
ON E.e_id = F.f_id ON B.b_id = D.d_id 


0 commentaires

3 Réponses :


2
votes

Oui, c'est possible. La requête que vous avez ici peut être clarifiée en utilisant des parenthèses:

Select *
FROM B  
INNER JOIN 
(
    C     
    INNER JOIN D  
        ON C.c_id = D.d_id   
    INNER JOIN E   
        ON C.c_id = E.e_id  
    INNER JOIN F   
        ON E.e_id = F.f_id
) 
ON B.b_id = D.d_id

Vous pouvez en savoir plus sur diverses stratégies de jointure ici , si vous êtes intéressé. Ce cas particulier est illustré comme la troisième option.

Edit: Je dois noter que cela peut ne pas fonctionner dans tous les moteurs de base de données, et je ne trouve pas non plus une manière particulièrement élégante d'écrire une requête. Pourtant, il est valide dans certains contextes au moins.


1 commentaires

Merci. Cela rend ces requêtes un peu plus lisibles pour moi.



0
votes

Oui, c'est une syntaxe parfaitement valide ... C'est le signe révélateur que quelqu'un utilise le concepteur de requêtes graphique dans SSMS.

Parce qu'aucun humain sensé n'écrirait jamais t-sql comme, vous pouvez être sûr à au moins 99,9% qu'il s'agit d'un t-sql généré par la machine.


0 commentaires

1
votes

J'utilise plus couramment ce modèle dans les situations LEFT JOIN / INNER JOIN. Par exemple, imaginez une situation où l'adresse d'un client est facultative mais, lorsqu'une adresse est fournie, la ville est obligatoire et existera toujours.

SELECT c.CustomerName, ca.AddressLine1, cy.CityName
    FROM Customer c
        LEFT JOIN (CustomerAddress ca
            INNER JOIN City cy
                ON ca.CityID = cy.CityID)
            ON c.CustomerID = ca.CustomerID;

Et, comme d'autres l'ont mentionné, les parenthèses peuvent clarifier l'intention.

SELECT c.CustomerName, ca.AddressLine1, cy.CityName
    FROM Customer c
        LEFT JOIN CustomerAddress ca
            INNER JOIN City cy
                ON ca.CityID = cy.CityID
            ON c.CustomerID = ca.CustomerID;


1 commentaires

Merci. Cet exemple a beaucoup de sens