Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/02/2011, 11h49   #1
Invité de passage
 
Inscription : septembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 35
Points : 0
Points : 0
Par défaut Requete avec jointure interne "inversée"

Bonjour,

voilà, j'explique mon problème, je n'arrive pas à trouver la requete qui me permetterais la sélection suivante :

J'ai 2 tables A et B.
Dans A et B j'ai 2 champs identiques on va dire champ1 et champ2

Ma requete est la suivante :

Code :
1
2
SELECT A.champ1, A.champ2  FROM A
INNER JOIN B on (A.champ1<>B.champ1 and A.champ2<>B.champ2)
Je cherche à avoir toutes les lignes de A qui ont le couple (champ1, champ2) différent dans B.

Ex :

A
Champ 1 Champ 2
ab cd
ac de
de df

B
Champ 1 Champ 2
ab cd
ac de
dg df

Mon résultat devrait être :

de df

Le problème c'est que ma requete me renvoi bien autre chose

Merci d'avance
huggy49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 11h59   #2
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 939
Points : 7 939
bjr,

c'est normal, tu demande les couples de lignes de A et B qui sont différentes
il y a donc 6 combinaisons différentes

il faut joindre les tables sur un champ commun, puis filtrer les lignes dont champ1 et champ2 sont égaux
il faut donc obligatoirement une clé commune entre les deux tables, sinon le SQL ne sait pas quelle ligne de A est à comparer avec quelle ligne de B
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 12h06   #3
Invité de passage
 
Inscription : septembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 35
Points : 0
Points : 0
Les clés primaires pour les 2 tables sont ce couple justement.
huggy49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 12h14   #4
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 878
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 878
Points : 7 655
Points : 7 655
Pas sur que ce soit possible tel que tu veux le faire.

Ta raquette donne le résultat suivant :
Pour chacune des lignes de A, je renvoie autant de lignes de résultat que j'obtiens de ligne dans B respectant la condition.

Donc en gros, tu va renvoyer la table A complète sous forme d'une quantité importante de doublons, puisque chacune des lignes de A aura probablement une ou plusieurs ligne dans B qui respecte la condition.

Essaye plutôt ceci :
Code :
1
2
3
SELECT A.Champ1, A.Champ2 FROM A
WHERE NOT EXIST( SELECT * FROM B WHERE 
A.champ1=B.champ1 and A.champ2=B.champ2)
PAs sur de la syntaxe de ma requete mais c'est l'idée
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 12h26   #5
Invité de passage
 
Inscription : septembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 35
Points : 0
Points : 0
J'aurais pu utiliser l'ensemble EXCEPT, mais ce n'est pas géré dans ACCESS :

select champ1,champ2 from A EXCEPT SELECT A.champ1, A.champ2 FROM A inner JOIN B on (A.champ1=B.champ1 and A.champ2=B.champ2)

Mais bon j'ai des doutes au niveau performance sur cette requete.
huggy49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 13h53   #6
Invité de passage
 
Inscription : septembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 35
Points : 0
Points : 0
Par défaut Résolu

La syntaxe exacte est la suivante (il manquait un S à EXIST) :

Code :
SELECT A.Champ1, A.Champ2 FROM A
WHERE NOT EXISTS ( SELECT * FROM B WHERE
A.champ1=B.champ1 and A.champ2=B.champ2)

Merci bien pour votre aide
Résolu
huggy49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 14h22   #7
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour,

Je me permets de m'immiscer...

Cette requête donne le résultat escompté (via l'assistant, c'est plus clair).
Sinon, en SQL, cela donne (généré par l'assistant) :
Code sql :
1
2
3
SELECT A.Champ1, A.Champ2, B.Champ1, B.Champ2
FROM A LEFT JOIN B ON (A.Champ2 = B.Champ2) AND (A.Champ1 = B.Champ1)
WHERE (((B.Champ1) IS NULL)) OR (((B.Champ2) IS NULL));
En aparté, il me semble que les jointures sont plus performantes que les EXIST => SELECT => WHERE.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h06.


 
 
 
 
Partenaires

Hébergement Web