Bonjour,
Lorsque j'ai des requêtes un peu complexes combinant des INNER JOIN et OUTER JOIN en cascade, il m'arrive d'utiliser des parenthèses afin non pas de bordéliser le code, mais pour hiérarchiser les jointures.
Il y a peu, une personne avait posté sur ce forum une requête (mal écrite, certes) contenant des parenthèses dans le FROM, et SQLPro, de mémoire, en qui j'ai toute confiance, avait répondu qu'on ne devait jamais mettre de parenthèses dans un FROM, que c'était inutile. J'avoue que ça m'a étonné.
Mais je fus encore plus perplexe quelques jours plus tard lorsque j'ai écrit une requête vraiment complexe, et que les parenthèses se sont mises à déconner !
Voici un exemple simple de ce que je fais habituellement :
Nous avons des personnes, qui travaillent (ou non) dans un service, et chaque service à une adresse.
=> On veut afficher la liste du personnel, du service et son adresse si applicable
adr (id, ville)
srv (id, nom, a_id fk adr(id))
prs (id, nom, s_id fk srv(id))
J'écris donc :
=> Avec SQL Server 2014 Express, tout du moins, ça marche très bien, et je ne vois pas comment on peut écrire rigoureusement la même chose sans passer par une sous-requête (ou CTE). En effet, des outer join en cascade ne ramèneront pas le même résultat si des services n'ont pas d'adresse.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select p.id, p.nom, s.nom, a.ville from prs p left outer join ( srv s inner join adr a on a.id = srv.a_id ) on s.id = p.s_id
Pourtant, l'autre jour, je me suis retrouvé avec une requête qui s'est mise à déconner, et qui a décidé de me retourner le résultat d'un inner join au lieu d'un outer join.
Je n'arrive toujours pas à comprendre.
J'avais quelque chose de plus complexe :
prs (id, nom, s_id fk srv(id), a_id fk adr(id))
=> Une personne travaille dans un service, mais pas forcément à l'adresse du service. Et on veut récupérer uniquement les info des services pour lesquelles la personne travaille à la même adresse que son service.
=> J'ai beau tortiller le truc dans tous les sens, j'ai quand même le résultat attendu...
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select p.id, p.nom, s.nom, a.ville from prs p left outer join ( srv s inner join adr a on a.id = srv.a_id ) on s.id = p.s_id and a.id = p.a_id
Est-ce que vous avez des cas en tête où ce genre de syntaxe ne fonctionne pas ?








Répondre avec citation
Partager