laurentvidalrouen
Messages postés1Date d'inscriptionmardi 17 janvier 2006StatutMembreDernière intervention23 septembre 2010
-
23 sept. 2010 à 12:27
cs_gogniol
Messages postés7Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention 7 mai 2011
-
23 sept. 2010 à 16:43
Bonjour,
J'utilise VB6 et ACCESS et j'ai un problème depuis bien longtemps avec ADO et DAO.
Mon cas :
FROM A LEFT JOIN B ON (A.CHP_1 = B.CHP_1) AND (A.CHP_2= B.CHP_2)
et
FROM A LEFT JOIN B ON (A.CHP_1 = B.CHP_1) AND (A.CHP_2+'000000'= B.CHP_2)
alors que marche très bien alors que
FROM A LEFT JOIN B ON (A.CHP_1 = B.CHP_1) AND ('000000'= B.CHP_2)
ne marche pas.
Je contourne en général avec une condition du genre :
FROM A LEFT JOIN B ON (A.CHP_1 = B.CHP_1)
WHERE (B.CHP_2='000000') OR (CHP_2 Is Null)
mais ça ne me donne pas toujours le bon résultat.
N'y a t-il pas un moyen de mettre ce genre d'argument dans la clause ON
cs_gogniol
Messages postés7Date d'inscriptionmardi 21 septembre 2010StatutMembreDernière intervention 7 mai 20111 23 sept. 2010 à 16:43
Bonjour,
Effectivement, Access n'accepte que des comparaisons entre les deux tables du JOIN dans une clause ON... Alors que d'autres SGBD acceptent les comparaisons avec des constants dans les clause ON.
Les deux :
FROM A LEFT JOIN B ON (A.CHP_1 = B.CHP_1) AND ('000000'= B.CHP_2) (1)
et
FROM A LEFT JOIN B ON (A.CHP_1 = B.CHP_1)
WHERE (B.CHP_2='000000') OR (CHP_2 Is Null) (2)
ne donnent pas le même résultat et c'est normal:
Dans le cas (1) il y a un filtre sur la table B et le JOIN se passe aprés (réduction du nombre d'enregistrement de B et donc il y aura plus d'enreg de A sans correspondances) alors que dans le cas (2) le filtre se place sur le résultat du JOIN (et donc ne retournera que les enregistrements du JOIN correspondant à la clause WHERE : notament les enreg qui sont dans A et joint à B mais qui ne correspondent pas à la clause WHERE seront supprimés).
ooohh je ne suis pas sur d'être clair ...
(Dis moi si tu veux un exemple)
Donc finalement pour t'en sortir, voici une solution :
SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE CHP_2='000000') AS B2 ON (A.CHP_1 = B2.CHP_1)