Bon, je sais que vous aimez pas ca (et moi non plus dans ces cas-la), mais etant loin d’etre un specialiste du SQL, j’arrive vraiment pas a m’en sortir avec ma requete… Donc j’aimerais que quelqu’un me fasse le boulot :paf:
J’ai deja decomposé la requete elle-meme, mais il doit y avoir moyen de faire ca proprement (une vague histoire de JOIN je suppose, mais yen a tellement, des external, natural, right, left, etc… que je m’y perds…)
SELECT Frame, Pbsur, Pbcal
FROM PB
WHERE idParamPB= (SELECT idParamPB
FROM ParamPB
WHERE idMolecule = ( SELECT idMolecule
FROM Molecule
WHERE Name = "XXX")
AND idTraj = ( SELECT idTraj
FROM Trajectory
WHERE Name = "YYY")
AND idPrmtop = ( SELECT idPrmtop
FROM Prmtop
WHERE Name = "ZZZ")
)
Edit : XXX, YYY et ZZZ sont des noms que je ferais varier dans mon programme, ou que l’user rentrera… enfin ca, je m’arrangerai par la suite
L’objectif, c’est de partir d’un nom de Molecule, d’un nom de Trajectoire, d’un nom de Prmtop, et d’obtenir tous les enregistrements de la table PB qui correspondent à ces noms (en passant par l’idParamPB, qui fait le lien entre la table PB et les autres…)
C’est ce que j’avais cru comprendre hier soir avant d’éteindre en lisant ta requête. perso, je ne fait jamais de requêtes imbriquées, plutôt des jointures (c’est ce que tu entendait par “join” ?)
Maintenant, une jointure sur 4 tables à la fois, ça risque d’être un peu lourd, à tester donc:
SELECT PB.Frame, PB.Pbsur, PB.Pbcal
FROM PB,ParamPB,Molecule,Trajectory,Prmtop
WHERE PB.idParamPB= ParamPB.idParamPB
AND ParamPB.idMolecule = Molecule.idMolecule
AND Molecule.Name = "XXX")
AND ParamPB.idTraj Trajectory.idTraj
AND Trajectory.Name = "YYY"
AND ParamPB.idPrmtop = Prmtop.idPrmtop
AND Prmtop.Name = "ZZZ"
;
Je ne te dis pas que ça marche tel quel, quand il y a ambiguité enter les noms de colonne, il faut préfixer par le nom de “table.”, ou alors ajouter le keyword “AS” pour nommer tes tables.
Bref, la jointure, c’est plusieurs tables dans ton from, et l’égalité des id entre toutes les tables. un jointure entre PB et paramPB, et d’autres jointures entre paramPB et Molecule, Trajectoire, Prmtop.
Sinon, avec un langage de prog, je ferai plutot une methode pour récupérer test 3 ids sépraéments, et éventuellement une seule jointure entre ParamPB et PB pour récupérer ton résultat final. surtour que les méthodes pour récupérer les id risquent d’être réutilisables.
Sympa le schema, c’est utile pour comprendre, et beaucoup de spécifieur oublient de nous donner ce genre de chose.
finalement, c’est une requete super simple !!
Je m’attendais a avoir des jointures de partout (enfin des “join” quoi…), et finalement, c’est du simple Select… From… Where avec des conditions de partout…
Bah merci beaucoup (en tous cas ca a l’air de donner ce que je veux, je reviendrai si c’est pas le cas…)
Au passage, si ya des puristes SQL qui pensent qu’on peut optimiser la requete (et qui savent le faire :hello: , je vous en prie
SELECT PB.Frame, PB.Pbsur, PB.Pbcal
FROM PB,ParamPB,Molecule,Trajectory,Prmtop
WHERE PB.idParamPB= ParamPB.idParamPB
AND ParamPB.idMolecule = Molecule.idMolecule
AND Molecule.Name = "XXX")
AND ParamPB.idTraj Trajectory.idTraj
AND Trajectory.Name = "YYY"
AND ParamPB.idPrmtop = Prmtop.idPrmtop
AND Prmtop.Name = "ZZZ"
;
Heu le produit cartésien que fait deltree (ie: FROM a, b, …, c + WHERE a.id = b.id) c’est une requête de jointure hein…