Requête "ET' qui ne fonctionne pas

Fermé
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015 - Modifié par jordane45 le 28/04/2015 à 10:58
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015 - 29 avril 2015 à 14:20
Bonjour,

j'utilise Microsoft Access pour créer une petite BDD. J'ai un problème que je ne comprend pas vraiment lorsque je veux faire un ET entre deux critères de sélection.

En gros j'ai une table nommé architecture-besoins de ce style:

architecture 1 besoin 1
architecture 1 besoin 2
Architecture 2 besoin 1
Architecture 2 besoin 2
Architecture 2 besoin 4
... ....

J'ai fais une requête qui me sort TOUTES les architectures qui satisfont un besoin donné (par exemple le besoin 1). Cette requête fonctionne:

SELECT [Architectures-besoins].Besoin, Materiel.Materiel

FROM Materiel INNER JOIN ([Architectures-besoins] INNER JOIN Materiel_Architecture ON [Architectures-besoins].Architecture = Materiel_Architecture.Architecture) ON Materiel.ID = Materiel_Architecture.ID_materiel

WHERE ((([Architectures-besoins].Besoin)="In-Flight connectivity"));


Je voudrais faire une requête qui me donne les architectures qui satisfont le besoin 1 ET le besoin 4 (par exemple, l'architecture 2 dans notre exemple):
SELECT [Architectures-besoins].Besoin
, Materiel.Materiel
, [Architectures-besoins].Besoin
FROM Materiel 
INNER JOIN ([Architectures-besoins] 
INNER JOIN Materiel_Architecture ON [Architectures-besoins].Architecture = Materiel_Architecture.Architecture) ON Materiel.ID = Materiel_Architecture.ID_materiel

WHERE ((([Architectures-besoins].Besoin)="In-Flight connectivity") AND (([Architectures-besoins].Besoin)="ACARS communication"));


mais elle ne fonctionne pas puisqu'elle ne renvoie aucune ligne. Dans cet exemple besoin 1 = In-Flight connectivity et besoin 2 = ACARS communication

Si quelqu'un avait une idée de comment arranger ce problème je suis preneur!

Merci d'avance ;)


EDIT : AJout des balises de code
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

9 réponses

jordane45 Messages postés 38244 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2024 4 690
28 avril 2015 à 10:59
Bonjour les clauses ON se mettent APRES CHAQUE jointure .. pas à la suite des unes des autres.....

SELECT *
FROM tbl1 
LEFT JOIN tbl2 ON tbl1.toto = tbl2.titi
INNER JOIN tbl3 ON tbl3.truc = tbl1.bidule
...


1
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
28 avril 2015 à 11:37
Bonjour,

les requêtes SQL sont générées par l'assistant de création de requêtes d'ACCESS. Lorsque j'essaie de les modifier comme tu le suggère j'ai une erreur de syntaxe qui apparait.
0
Bonjour

Il te faut un OR et non pas un AND dans ton WHERE.
Avec un AND, tu demandes que [Architectures-besoins].Besoin soit simultanément égal à "In-Flight connectivity" et à "ACARS communication", ce qui n'est pas possible.
0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
28 avril 2015 à 11:46
Si je mes une condition en OU, j'obtient cette requête:

SELECT Materiel.Materiel, [Architectures-besoins].Architecture

FROM Materiel INNER JOIN ([Architectures-besoins] INNER JOIN Materiel_Architecture ON [Architectures-besoins].Architecture = Materiel_Architecture.Architecture) ON Materiel.ID = Materiel_Architecture.ID_materiel

WHERE ((([Architectures-besoins].Besoin)="In-Flight connectivity")) OR ((([Architectures-besoins].Besoin)="ACARS communication"));


Qui me sort l'ensemble des architectures qui satisfont "In-Flight connectivity" ET l'ensemble des architectures qui satisfont "ACARS communication". or mois je voudrais uniquement les architectures qui satisfont les deux besoins.

Peut être que ma table en elle même est mal foutue, mais je ne vois pas comment la modifier intelligemment.
0
Utilisateur anonyme
28 avril 2015 à 12:14
Effectivement, j'avais mal compris ton besoin.
Ce qui est sûr, c'est que ça ne risque pas de marcher avec ce WHERE là.
Il doit falloir passer par une jointure de ta table Materiel sur elle-même pour pouvoir mettre le AND dont tu as besoin.
Je vais y réfléchir mais je ne promets rien, je ne suis pas spécialiste des bases de données.
0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
28 avril 2015 à 13:01
C'est très aimable, tiens moi au courant ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38244 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2024 4 690
28 avril 2015 à 11:52

SQL sont générées par l'assistant de création de requêtes d'ACCESS

ACCESS ?? Tu poses ta question dans SQL SERVER ?.....






0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
28 avril 2015 à 11:53
ha oui là je n'ai pas été bon... :/
Je n'avais pas remarqué l'existence d'un sous forum Access. Si un modo pouvait aimablement déplacer mon sujet, ce serait bien aimable.
0
jordane45 Messages postés 38244 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2024 4 690 > SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
28 avril 2015 à 11:58
je m'en occupe
0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
28 avril 2015 à 11:59
Merci!
0
C'était une auto jointure de la table Architectures-besoins, pas de la table Materiel.
En espérant que c'était bien ça que tu voulais :
SELECT Materiel.Materiel, ab1.Architecture, ab2.Architecture
FROM ([Architectures-besoins] AS ab1 INNER JOIN [Architectures-besoins] AS ab2 ON ab1.Architecture = ab2.Architecture) INNER JOIN (Materiel_Architecture INNER JOIN Materiel ON Materiel.ID=Materiel_Architecture.ID_materiel) ON ab1.Architecture = Materiel_Architecture.Architecture
WHERE (((ab1.Besoin)="In-Flight connectivity") AND ((ab2.Besoin)="ACARS communication"));

J'ai une base au format Access 2000 si tu veux
0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
29 avril 2015 à 09:33
Je ne comprends pas si je dois remplacer ab1 et ab2 par des noms de champs?

Si j'exécute ta requête, ACCESS me demande d'entrer une valeur de paramètre pour Architecture-besoins.Architecture. Or je n'ai pas à devoir entrer ce paramètre dans ma requête. le critère de tri étant uniquement le besoin.
0
J'ai créé une nouvelle requête et exécuté ta commande SQL. Access ne me demande aucun paramètre.
Par contre la requête me ressort 3 champs ( materiel, ab1.architecture et ab2.architecture) sachant que ab1.architecture et ab2.architecture sont identique.
Mais dans ces deux champs je n'ai pas uniquement les architectures qui satisfont les deux besoins en même temps. J'ai toutes les architectures qui satisfont le premier besoin et toutes celles qui satisfont le second besoin :/
0
Tu n'as pas à remplacer ab1 et ab2 par des noms de champ, ce sont des alias pour Architectures-besoins.
ACCESS me demande d'entrer une valeur de paramètre pour Architecture-besoins.Architecture
Le champ Architecture n'existe pas dans ta table [Architectures-besoin] ?
[Edit]
N'aurais-tu pas oublié un "s" à Architectures-besoins en recopiant la requête ?
La requête fonctionne chez moi sous access, avec des tables et des champs reprenant ceux qui figurent dans les requêtes que tu as données. La seule chose que je ne sais pas, c'est si ça fait bien ce que tu veux car je ne sais pas ce que signifient tes champs, j'ai essayé de deviner.
0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
29 avril 2015 à 11:47
Le champ Architecture existe bien dans la table [Architectures-besoin].
Lorsque j'exécute ta requête j'obtiens 3 champs:
-materiel
-ab1.architecture
-ab2.architecture
Sachant que ab1.architecture et ab2.architecture sont identiques (ils comprennent les mêmes informations.
Mais dans ces deux derniers champs je n'ai pas uniquement les architectures qui satisfont les deux besoins en même temps. J'ai toutes les architectures qui satisfont le premier besoin et toutes celles qui satisfont le second besoin.

A moins que cela ne ne donne pas le même résultat chez toi, ça ne donne pas ce que je voudrais. Je voudrais que cela n'affiche que les architectures qui satisfont les deux besoins à la fois :)
Je pense que l'on ai pas loin de la solution mais ce n'est pas encore tout à fait ça.
Merci pour ton aide
0
Tu as oublié de dire ce que tu avais fait pour passer d'une requête qui te sort une erreur à une requête qui te sort un résultat.

Lorsque j'exécute ta requête j'obtiens 3 champs:
Bien sûr, il y a 3 champs dans le select. Tu peux modifier si tu veux.

ab1.architecture et ab2.architecture sont identiques
Bien sûr, on a ON ab1.Architecture = ab2.Architecture dans la requête.

Chez moi, ça n'affiche que les architectures qui satisfont aux deux besoins à la fois. Peux-tu faire un copier-coller de la requête que tu exécutes (et surtout pas la recopier à la main) ?
0
SILBA31 Messages postés 37 Date d'inscription mardi 28 avril 2015 Statut Membre Dernière intervention 27 mai 2015
29 avril 2015 à 14:20
Au temps pour moi, ta requête fonctionne et sort le résultat attendu, j'avais fait une erreur de manip au premier coup.Merci beaucoup!

J'ai remplacé les critères par des paramètres modifiables par l'utilisateur:
PARAMETERS [Besoin 1] Text ( 255 ), [Besoin 2] Text ( 255 );
SELECT Materiel.Materiel, ab1.Architecture
FROM ([Architectures-besoins] AS ab1 INNER JOIN [Architectures-besoins] AS ab2 ON ab1.Architecture = ab2.Architecture) INNER JOIN (Materiel_Architecture INNER JOIN Materiel ON Materiel_Architecture.ID_materiel = Materiel.ID) ON ab1.Architecture = Materiel_Architecture.Architecture
WHERE (((ab1.Besoin)=[Besoin 1]) AND ((ab2.Besoin)=[Besoin 2]));


J'ai essayé d'inclure 3 choix au lieu de deux:

SELECT Materiel.Materiel, ab1.Architecture
FROM ([Architectures-besoins] AS ab1 INNER JOIN [Architectures-besoins] AS ab2 [Architectures-besoins] AS ab3 ON ab1.Architecture = ab2.Architecture=ab3.Architecture) INNER JOIN (Materiel_Architecture INNER JOIN Materiel ON Materiel_Architecture.ID_materiel = Materiel.ID) ON ab1.Architecture = Materiel_Architecture.Architecture
WHERE (((ab1.Besoin)="On-board wireless connectivity") AND ((ab2.Besoin)="ACARS communication") AND ((ab2.Besoin)="In-Flight connectivity"));


Mais je n'utilise pas la bonne syntaxe dans la partie FROM :/
0