Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

requête sql vb : mot réservé exists ?

6 réponses
Avatar
sonia.gaubert
Bonjour =E0 tous,
Je ne m'en sors pas, donc pour les courageux (?) :
Soit, li=E9 =E0 un bouton sur un formulaire, une requ=EAte dans une
requ=EAte :
Premi=E8re requ=EAte :
sd =3D "SELECT SousRequeteInvObjet.Fonds,
SousRequeteInvObjet.TitreChapitre, SousRequeteInvObjet.RefRenvoiTerme,
SousRequeteInvObjet.RefObjetNum, SousRequeteInvObjet.NumFonds,
SousRequeteInvObjet.RefFonds, SousRequeteInvObjet.Titre,
SousRequeteInvObjet.Refobjet"
sd =3D sd & " FROM SousRequeteInvObjet WHERE
(((SousRequeteInvObjet.NumFonds) Is Not Null)"
Deuxi=E8me requ=EAte (sous-requ=EAte)
TermesMulti =3D "SELECT SousRequeteTypologie.RefObjInvTypo,
SousRequeteTypologie.TypeRenvoi, SousRequeteTypologie.RefRenvoiTerme,
SousRequeteTypologie.RefTerme, SousRequeteTypologie.RefTerm,
SousRequeteTypologie.RefTyp2, SousRequeteTypologie.RefTyp1,
SousRequeteTypologie.RefTermeLie"
TermesMulti =3D TermesMulti & " FROM SousRequeteTypologie WHERE
(((SousRequeteTypologie.RefobjInvTypo) Is Not Null)"

... au lancement de la recherche j'ai un message d'erreur qui me dit
la chose suivante : "vous avez =E9crits une sous-requ=EAte pouvant
renvoyer plus d'un champs sans utiliser le mot r=E9serv=E9 Exists dans la
close From de la requ=EAte... r=E9visez la close From de la sous-requ=EAte
pour n'obtenir qu'un seul champ"
!!??
Quelqu'un peut-il m'aider ?
Par avance, merci :o)
Sonia.

6 réponses

Avatar
Richard_35
Bonjour Sonia,

Il n'y a aucun champ de liaison entre tes deux requêtes !

En tout état de cause, le résultat de ta sous-requête ne doit renvoyer qu'un
seul enregistrement contenant le champ NumFonds, puisque qu'il est testé
dans ta requête "mère" (WHERE NumFonds Is Not Null). Si ta sous-requête
renvoie plusieurs enregistrements (contenant le champ NumFonds), le SQL ne
s'en sort pas.

La requête "sd" est-elle liée à la requête "TermesMulti" par NumFonds ?
L'objectif est-il de sélectionner l'ensemble des enregistrements de "sd"
existants dans "TermesMulti" (via Numfonds, donc) ?

A bientôt,
Richard.

a écrit dans le message de news:

Bonjour à tous,
Je ne m'en sors pas, donc pour les courageux (?) :
Soit, lié à un bouton sur un formulaire, une requête dans une
requête :
Première requête :
sd = "SELECT SousRequeteInvObjet.Fonds,
SousRequeteInvObjet.TitreChapitre, SousRequeteInvObjet.RefRenvoiTerme,
SousRequeteInvObjet.RefObjetNum, SousRequeteInvObjet.NumFonds,
SousRequeteInvObjet.RefFonds, SousRequeteInvObjet.Titre,
SousRequeteInvObjet.Refobjet"
sd = sd & " FROM SousRequeteInvObjet WHERE
(((SousRequeteInvObjet.NumFonds) Is Not Null)"
Deuxième requête (sous-requête)
TermesMulti = "SELECT SousRequeteTypologie.RefObjInvTypo,
SousRequeteTypologie.TypeRenvoi, SousRequeteTypologie.RefRenvoiTerme,
SousRequeteTypologie.RefTerme, SousRequeteTypologie.RefTerm,
SousRequeteTypologie.RefTyp2, SousRequeteTypologie.RefTyp1,
SousRequeteTypologie.RefTermeLie"
TermesMulti = TermesMulti & " FROM SousRequeteTypologie WHERE
(((SousRequeteTypologie.RefobjInvTypo) Is Not Null)"

... au lancement de la recherche j'ai un message d'erreur qui me dit
la chose suivante : "vous avez écrits une sous-requête pouvant
renvoyer plus d'un champs sans utiliser le mot réservé Exists dans la
close From de la requête... révisez la close From de la sous-requête
pour n'obtenir qu'un seul champ"
!!??
Quelqu'un peut-il m'aider ?
Par avance, merci :o)
Sonia.
Avatar
sonia.gaubert
Bonsoir Richard et merci beaucoup pour ton intérêt :o)

Le lien entre les deux requêtes ne se fait pas sur le numéro du fonds
(NumFonds) qui appartient à la table la plus haute de la "hiérarchie"
des tables, mais se situe au niveau de la "référence objet", c'est à
dire entre :
- côté requête mère : RefObjetNum
- côté fille : RefObjInvTypo

Si cela peut t'éclairer... ?
A demain matin je supposes ;o)
Sonia.

Il n'y a aucun champ de liaison entre tes deux requêtes !

En tout état de cause, le résultat de ta sous-requête ne doit renvo yer qu'un
seul enregistrement contenant le champ NumFonds, puisque qu'il est test é
dans ta requête "mère" (WHERE NumFonds Is Not Null). Si ta sous-requ ête
renvoie plusieurs enregistrements (contenant le champ NumFonds), le SQL n e
s'en sort pas.

La requête "sd" est-elle liée à la requête "TermesMulti" par NumF onds ?
L'objectif est-il de sélectionner l'ensemble des enregistrements de "sd "
existants dans "TermesMulti" (via Numfonds, donc) ?




Avatar
sonia.gaubert
Bonjour,
En fait, suivant vos indications, j'ai supprimé - de ma sous-requête -
la table qui faisait le lien (plus ou moins directe mais...) avec la
première requête (via la "référence objet") : pour autant, j'ai
toujours le même message !!!
Voilà ce que j'ai écris :
1re requête inchangée
2e requête :
TermesMulti = "SELECT SousRequeteTypologie.TypeRenvoi,
SousRequeteTypologie.RefRenvoiTerme, SousRequeteTypologie.RefTerme,
SousRequeteTypologie.RefTyp2, SousRequeteTypologie.RefTyp1,
SousRequeteTypologie.RefTermeLie"
TermesMulti = TermesMulti & " FROM SousRequeteTypologie WHERE
(((SousRequeteTypologie.RefTerme) Is Not Null)"

Je ne sais si cela changerait quelque chose, mais j'aimerais essayer
de ne pas faire référence à une requête pré-enregistrer en indiqu ant
directement le code SQL.... sauf que je suis pas douée et que je ne
sais comment "traduire" en vb (si d'aucun avait d'ailleurs un
didacticiel à m'indiquer pour ce faire, j'aimerais bien ;o)
Voilà ce que j'ai essayé (en fait juste fait un copié/collé du SQL +
ajout SELECT et les guillemets : mais bien sûr cela ne va pas !)

TermesMulti = "SELECT TermesIndex.TypeRenvoi,
TermesIndex.RefRenvoiTerme, Termes.RefTerme, Typologie2.RefTyp2,
Typologie1.RefTyp1 FROM ((Termes LEFT JOIN TermesIndex ON
Termes.RefTerme = TermesIndex.RefTermeLie) LEFT JOIN Typologie2 ON
Termes.RefTyp2 = Typologie2.RefTyp2) LEFT JOIN Typologie1 ON
Typologie2.RefTyp1 = Typologie1.RefTyp1"

Par avance, merci à ceux qui voudront bien (encore !) m'aider,
Sonia.
Avatar
Richard_35
Bonjour Sonia,

C'est dans la première requête qu'il faut établir le lien entre tes deux
requêtes.

Requête mère :
SELECT SousRequeteInvObjet.NumFonds, SousRequeteInvObjet.RefObjetNum
FROM SousRequeteInvObjet, SousRequeteTypologie
WHERE (SousRequeteInvObjet.NumFonds Is Not Null AND
SousRequeteInvObjet.RefObjetNum=SousRequeteTypologie.RefObjInvTypo)

Requête fille (SousRequeteTypologie) :
SELECT SousRequeteTypologie.RefObjInvTypo
FROM SousRequeteTypologie
WHERE (SousRequeteTypologie.RefobjInvTypo Is Not Null)

Pas testé, mais un truc dans le genre.
Je suis parti de l'hypothèse que tu voulais tous les enregistrements de
SousRequeteInvObjet dont SousRequeteInvObjet.NumFonds est renseigné et qui
existent dans SousRequeteTypologie (en comparant RefObjetNum et
RefObjInvTypo) et dont RefobjInvTypo est renseigné.

Afin d'éviter les erreurs, je te conseille de passer par l'assistant pour
créer tes requêtes :
Requête 1 :
- Sélectionner : "SousRequeteInvObjet"
- Champs : "NumFonds", "RefObjetNum"
- Critère : "NumFonds Is Not Null "

Requête 2 :
- Sélectionner : "SousRequeteTypologie"
- Champ : "RefobjInvTypo"
- Critère : "RefobjInvTypo Is Not Null"

Requête 3 :
- Sélectionner : "Requete1" et "Requete2" liée par "RefObjetNum" =
"RefObjInvTypo"

Je n'ai mis que les champs "clés", tu pourras ajouter les champs
informations après.

Dis-nous et bon courage,
Richard.

a écrit dans le message de news:

Bonjour,
En fait, suivant vos indications, j'ai supprimé - de ma sous-requête -
la table qui faisait le lien (plus ou moins directe mais...) avec la
première requête (via la "référence objet") : pour autant, j'ai
toujours le même message !!!
Voilà ce que j'ai écris :
1re requête inchangée
2e requête :
TermesMulti = "SELECT SousRequeteTypologie.TypeRenvoi,
SousRequeteTypologie.RefRenvoiTerme, SousRequeteTypologie.RefTerme,
SousRequeteTypologie.RefTyp2, SousRequeteTypologie.RefTyp1,
SousRequeteTypologie.RefTermeLie"
TermesMulti = TermesMulti & " FROM SousRequeteTypologie WHERE
(((SousRequeteTypologie.RefTerme) Is Not Null)"

Je ne sais si cela changerait quelque chose, mais j'aimerais essayer
de ne pas faire référence à une requête pré-enregistrer en indiquant
directement le code SQL.... sauf que je suis pas douée et que je ne
sais comment "traduire" en vb (si d'aucun avait d'ailleurs un
didacticiel à m'indiquer pour ce faire, j'aimerais bien ;o)
Voilà ce que j'ai essayé (en fait juste fait un copié/collé du SQL +
ajout SELECT et les guillemets : mais bien sûr cela ne va pas !)

TermesMulti = "SELECT TermesIndex.TypeRenvoi,
TermesIndex.RefRenvoiTerme, Termes.RefTerme, Typologie2.RefTyp2,
Typologie1.RefTyp1 FROM ((Termes LEFT JOIN TermesIndex ON
Termes.RefTerme = TermesIndex.RefTermeLie) LEFT JOIN Typologie2 ON
Termes.RefTyp2 = Typologie2.RefTyp2) LEFT JOIN Typologie1 ON
Typologie2.RefTyp1 = Typologie1.RefTyp1"

Par avance, merci à ceux qui voudront bien (encore !) m'aider,
Sonia.
Avatar
sonia.gaubert
Bonjour Richard et merci encore,

Ce que tu me disais me paraissait bizarre... en effet tout ce code
est associé à un formulaire de recherche qui utilise la requête mèr e
telle que, avec d'autres sous-requêtes liées sur le même principe (et
sans références ajoutées aux tables liées...) sans que cela n'ai
jamais posé de problème...
Par ailleurs ma première sous-requête intégrant la "référence obj et"
marchait bien avant... que ne n'ajoute une table supplémentaire... je
suis donc revenue à ma première version, sans passer par la sous-
requête enregistrée, et simplement en n'ajoutant pas, comme je l'avais
fait, les références aux champs...
Et maintenant ça marche (!!) : je ne m'explique pas vraiment, mais le
système identifie bien les champs de cette sous-requête, sans que j'ai
à les mentionner explicitement, donc tout va beaucoup mieux :o)
Voilà ce qu'il fallait donc que j'écrive :

TermesMulti = "SELECT InvTypologie.RefObjInvTypo FROM (Termes RIGHT
JOIN ((InvTypologie LEFT JOIN Typologie2 ON InvTypologie.RefTyp2 =
Typologie2.RefTyp2) LEFT JOIN Typologie1 ON InvTypologie.RefTyp1 =
Typologie1.RefTyp1) ON Termes.RefTerme = InvTypologie.RefTerm) LEFT
JOIN TermesIndex ON Termes.RefTerme = TermesIndex.RefTermeLie"
TermesMulti = TermesMulti & " WHERE (((InvTypologie.RefobjInvTypo) Is
Not Null)"

Comme quoi, même quand on est nulle comme moi, en insistant on fini
par y arriver ;o)
Merci pour le soutien moral quoiqu'il en soit :o)
Très bon dimanche,
Sonia.




C'est dans la première requête qu'il faut établir le lien entre tes deux
requêtes.

Requête mère :
SELECT SousRequeteInvObjet.NumFonds, SousRequeteInvObjet.RefObjetNum
FROM SousRequeteInvObjet, SousRequeteTypologie
WHERE (SousRequeteInvObjet.NumFonds Is Not Null AND
SousRequeteInvObjet.RefObjetNum=SousRequeteTypologie.RefObjInvTypo)

Requête fille (SousRequeteTypologie) :
SELECT SousRequeteTypologie.RefObjInvTypo
FROM SousRequeteTypologie
WHERE (SousRequeteTypologie.RefobjInvTypo Is Not Null)

Pas testé, mais un truc dans le genre.
Je suis parti de l'hypothèse que tu voulais tous les enregistrements de
SousRequeteInvObjet dont SousRequeteInvObjet.NumFonds est renseigné et qui
existent dans SousRequeteTypologie (en comparant RefObjetNum et
RefObjInvTypo) et dont RefobjInvTypo est renseigné.

Afin d'éviter les erreurs, je te conseille de passer par l'assistant po ur
créer tes requêtes :
Requête 1 :
- Sélectionner : "SousRequeteInvObjet"
- Champs : "NumFonds", "RefObjetNum"
- Critère : "NumFonds Is Not Null "

Requête 2 :
- Sélectionner : "SousRequeteTypologie"
- Champ : "RefobjInvTypo"
- Critère : "RefobjInvTypo Is Not Null"

Requête 3 :
- Sélectionner : "Requete1" et "Requete2" liée par "RefObjetNum" =
"RefObjInvTypo"

Je n'ai mis que les champs "clés", tu pourras ajouter les champs
informations après.



Avatar
Richard_35
Cela paraît normal (si j'ai bien compris).
Les RIGHT JOIN et LEFT JOIN t'ont obligé à établir les fameux liens
manquants.

Dans ton premier post, je ne vois aucun lien entre "sd" et "TermesMulti".

Quoiqu'il en soit, si tout baigne, alors ça baigne...
Richard.

a écrit dans le message de news:

Bonjour Richard et merci encore,

Ce que tu me disais me paraissait bizarre... en effet tout ce code
est associé à un formulaire de recherche qui utilise la requête mère
telle que, avec d'autres sous-requêtes liées sur le même principe (et
sans références ajoutées aux tables liées...) sans que cela n'ai
jamais posé de problème...
Par ailleurs ma première sous-requête intégrant la "référence objet"
marchait bien avant... que ne n'ajoute une table supplémentaire... je
suis donc revenue à ma première version, sans passer par la sous-
requête enregistrée, et simplement en n'ajoutant pas, comme je l'avais
fait, les références aux champs...
Et maintenant ça marche (!!) : je ne m'explique pas vraiment, mais le
système identifie bien les champs de cette sous-requête, sans que j'ai
à les mentionner explicitement, donc tout va beaucoup mieux :o)
Voilà ce qu'il fallait donc que j'écrive :

TermesMulti = "SELECT InvTypologie.RefObjInvTypo FROM (Termes RIGHT
JOIN ((InvTypologie LEFT JOIN Typologie2 ON InvTypologie.RefTyp2 Typologie2.RefTyp2) LEFT JOIN Typologie1 ON InvTypologie.RefTyp1 Typologie1.RefTyp1) ON Termes.RefTerme = InvTypologie.RefTerm) LEFT
JOIN TermesIndex ON Termes.RefTerme = TermesIndex.RefTermeLie"
TermesMulti = TermesMulti & " WHERE (((InvTypologie.RefobjInvTypo) Is
Not Null)"

Comme quoi, même quand on est nulle comme moi, en insistant on fini
par y arriver ;o)
Merci pour le soutien moral quoiqu'il en soit :o)
Très bon dimanche,
Sonia.




C'est dans la première requête qu'il faut établir le lien entre tes deux
requêtes.

Requête mère :
SELECT SousRequeteInvObjet.NumFonds, SousRequeteInvObjet.RefObjetNum
FROM SousRequeteInvObjet, SousRequeteTypologie
WHERE (SousRequeteInvObjet.NumFonds Is Not Null AND
SousRequeteInvObjet.RefObjetNum=SousRequeteTypologie.RefObjInvTypo)

Requête fille (SousRequeteTypologie) :
SELECT SousRequeteTypologie.RefObjInvTypo
FROM SousRequeteTypologie
WHERE (SousRequeteTypologie.RefobjInvTypo Is Not Null)

Pas testé, mais un truc dans le genre.
Je suis parti de l'hypothèse que tu voulais tous les enregistrements de
SousRequeteInvObjet dont SousRequeteInvObjet.NumFonds est renseigné et qui
existent dans SousRequeteTypologie (en comparant RefObjetNum et
RefObjInvTypo) et dont RefobjInvTypo est renseigné.

Afin d'éviter les erreurs, je te conseille de passer par l'assistant pour
créer tes requêtes :
Requête 1 :
- Sélectionner : "SousRequeteInvObjet"
- Champs : "NumFonds", "RefObjetNum"
- Critère : "NumFonds Is Not Null "

Requête 2 :
- Sélectionner : "SousRequeteTypologie"
- Champ : "RefobjInvTypo"
- Critère : "RefobjInvTypo Is Not Null"

Requête 3 :
- Sélectionner : "Requete1" et "Requete2" liée par "RefObjetNum" > "RefObjInvTypo"

Je n'ai mis que les champs "clés", tu pourras ajouter les champs
informations après.