VB6 ACCESS LEFT JOIN

laurentvidalrouen Messages postés 1 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 23 septembre 2010 - 23 sept. 2010 à 12:27
cs_gogniol Messages postés 7 Date d'inscription mardi 21 septembre 2010 Statut Membre Derniè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

Merci de votre aide,
Laurent

1 réponse

cs_gogniol Messages postés 7 Date d'inscription mardi 21 septembre 2010 Statut Membre Dernière intervention 7 mai 2011 1
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)

Et tu devrait avoir le résultat attendu

Cordialement
Gogniol
0
Rejoignez-nous