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 16/11/2011, 17h10   #1
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Par défaut Economiser l’ecriture de la sous-requete qui se repete:

Bonjour a tous,

Je me demande si il existe une maniere plus elegante d’ecrire cette requete vu que la sous-requete se repete au niveau de chaque critere. J’ai pense a utiliser un parameter mais les parameters ne prennent que des valeurs et non des resultats d’une autre sous-requete.
Merci d’avance.

Cordialement,
Bonero.

Code :
1
2
3
4
5
SELECT FC_Q10.*
FROM FC_Q10
WHERE (((FC_Q10.CUST_CTY_CDE) In (Select Distinct ReportCountry.CountryCode From ReportCountry ))) 
	OR (((FC_Q10.RSK_CTY) In (Select Distinct ReportCountry.CountryCode From ReportCountry ))) 
OR (((FC_Q10.GUARANT_CTY_CDE) In (Select Distinct ReportCountry.CountryCode From ReportCountry )));
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 18h40   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Bonsoir Bonero,

Tant que tu maîtriseras pas les jointures, tu auras ce genre de problème. Car celles-ci (les jointures) résoudront ton souci.

Analysons ta requête
Code sql :
1
2
3
4
.../...
WHERE (((FC_Q10.CUST_CTY_CDE)    In (Select Distinct ReportCountry.CountryCode From ReportCountry )))
   OR (((FC_Q10.RSK_CTY)         In (Select Distinct ReportCountry.CountryCode From ReportCountry )))
   OR (((FC_Q10.GUARANT_CTY_CDE) In (Select Distinct ReportCountry.CountryCode From ReportCountry )));
IN veut dire "présent dans la liste (...)" ;
DISTINCT veut dire "retourner un seul enregistrement" ;
==> tu demandes donc à Access de faire un test de présence dans une liste d'un seul élément !... pas très optimisé...
==> il s'agit donc, là encore, d'une jointure à établir entre FC_Q10 et ReportCountry (LEFT JOIN).

Je te suggère, une nouvelle fois, de passer par l'assistant, c'est très clair, et Access fait rarement d'erreur de syntaxe SQL sur le code qu'il a, lui-même, généré.
__________________
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
Vieux 18/11/2011, 10h01   #3
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Merci Richard_35 pour ta reponse,

La sous requete
Code :
(Select Distinct ReportCountry.CountryCode From ReportCountry )
ne renvoie pas un SEUL element mais une liste d’elements qui ne se repetent pas.
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 10h19   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Bonjour Bonero,

Citation:
Envoyé par Bonero
La sous requete
Code sql :
(SELECT DISTINCT ReportCountry.CountryCode FROM ReportCountry )
ne renvoie pas un SEUL element mais une liste d’elements qui ne se repetent pas.
==> exact, erreur de ma part, désolé.


Il n'empêche que
Citation:
Tant que tu maîtriseras pas les jointures, tu auras ce genre de problème. Car celles-ci (les jointures) résoudront ton souci.
et que
Citation:
Je te suggère, une nouvelle fois, de passer par l'assistant, c'est très clair, et Access fait rarement d'erreur de syntaxe SQL sur le code qu'il a, lui-même, généré.

Donc, la solution passe par des jointures.
__________________
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
Vieux 18/11/2011, 11h23   #5
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Re-bonjour Richard,

Je sais tres bien que ce probleme peut etre resolu par les jointures mais le hic est que j’ai 1 seul champs de jointure dans la table ReportCountry tandis que j’en ai 3 au niveau de la table FC_Q10. Par consequent, je ne peux plus utiliser l’assistant car ce dernier ne propose que la possibilite de choisir qu’un seul champs de jointure entre 2 tables.

Pour preuve, l’assistant n’est pas capable de representer graphiquement le code suivant qui donne le result escompte.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT distinctrow FC_Q10.*
, FC_Q10.GUARANT_CTY_CDE
, FC_Q10.CUST_CTY_CDE
, FC_Q10.RSK_CTY
FROM FC_Q10 
Right  JOIN ReportCountry 
ON FC_Q10.CUST_CTY_CDE = ReportCountry.CountryCode
 
or 
 
FC_Q10.RSK_CTY = ReportCountry.CountryCode
 
or 
 
FC_Q10.GUARANT_CTY_CDE = ReportCountry.CountryCode ;
Dis moi ce que tu en penses.

Cordiallement,
Bonero.
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 11h54   #6
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Dans l'assistant, il faut ajouter trois fois la même table ReportCountry : Access va les suffixer ReportCountry_1 et ReportCountry_2 (sur 2003).

Ensuite, effectuer les jointures de tes trois champs de la table FC_Q10 vers les trois tables (un champ par table). Attention à indiquer les flèches à droite (LEFT JOIN).

Tu devrais obtenir ce que tu souhaites.
__________________
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
Vieux 18/11/2011, 14h22   #7
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Salut Richard,
il y a une petite erreur qui s'etait glissee dans ma requete d'avant.C'est un INNER JOIN que je voulais definir car IN(dans une sous requete) “correspond” a un INNER JOIN(dans une jointure).


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT distinctrow FC_Q10.*
, FC_Q10.GUARANT_CTY_CDE
, FC_Q10.CUST_CTY_CDE
, FC_Q10.RSK_CTY
FROM FC_Q10 
INNER  JOIN ReportCountry 
ON FC_Q10.CUST_CTY_CDE = ReportCountry.CountryCode

or 

FC_Q10.RSK_CTY = ReportCountry.CountryCode

or 

FC_Q10.GUARANT_CTY_CDE = ReportCountry.CountryCode ;

J’ai suivi tes recommendations(mais plus de fleches au niveau des jointures car je veux un INNER Join) mais je n’obtiens pas le meme result. L’assistant interprete les 3 jointures (vers les tables ReportCountry, ReportCountry_1, ReportCountry_2) comme des conditions/criteres simultanees. Je ne veux pas avoir des conditions simultannees (ie AND ).
Je precise d’ailleurs que je n’aurais meme pas besoin d’ajouter 3 fois la meme table (ReportCountry) si je voulais avoir des conditions simultannees. J’aurais pu avoir toutes les 3 jointures entre uniquement mes 2 tables (FC_Q10 et ReportCountry).



Une autre suggestion???

Grand merci pour tes aides.
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 14h54   #8
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Citation:
Envoyé par Bonero
Je ne veux pas avoir des conditions simultannees (ie AND ).
==> c'est pour cela qu'il faut une flèche à droite (LEFT JOINT) : c'est après qu'il faut tester les valeur NULL selon ton besoin.

Peux-tu poster l'image de ta requête (via l'assistant) ?
__________________
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
Vieux 18/11/2011, 15h24   #9
Membre du Club
 
bonero pross
Inscription : janvier 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : bonero pross

Informations forums :
Inscription : janvier 2010
Messages : 160
Points : 58
Points : 58
Salut Richard,

Desole si je m’exprime mal. lol
Ce tableau resume un peu ce que je veux obtenir.

Condition 1: Jointure 1 ; INNER JOIN :

Condition 2: Jointure 2 ; INNER JOIN:

Condition 3: Jointure 3 ; INNER JOIN

C’est a dire que je veux des conditions simultannees au niveau de chaque jointure prise individuellemt.

Mais la relation entre les conditions elles-memes doit etre:
Condition1 OR Condition2 OR Condition3
Bonero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h42   #10
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 178
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 178
Points : 2 807
Points : 2 807
Avec un LEFT JOIN (flèche à droite), tu as les enregistrements de FC_Q10, avec :
  • le ReportCountry de CUST_CTY_CDE, s'il existe, sinon NULL ;
  • le ReportCountry de RSK_CTY , s'il existe, sinon NULL ;
  • le ReportCountry de GUARANT_CTY_CDE , s'il existe, sinon NULL.
Ensuite, tu utilises la clause WHERE avec les OR qui vont bien (via l'assistant).
__________________
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é Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h02.


 
 
 
 
Partenaires

Hébergement Web