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
3 Réponses :
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.
Merci. Cela rend ces requêtes un peu plus lisibles pour moi.
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.
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;
Merci. Cet exemple a beaucoup de sens