| |
Membre enregistré 1 640 messages |
|
| Posté le 18 août 2014 - 15:19 |
Bonjour,
Je n'arrive pas a faire une requete :
Je souhaite rechercher tout les enregistrement dont un champ ne contient pas UNE LISTE de valeurs. Cette liste est variable, je ne peux donc pas le saisir manuellement (avec des OU par exemple) . Cette liste est acquise depuis une autre table.
Merci pour vos réponses |
| |
| |
| | | |
|
| | |
| |
| Posté le 18 août 2014 - 15:24 |
Bonjour :
Ne contient pas une liste de valeurs, ou bien N'est pas dans une liste de valeurs ??
select * from client where id_client not in ( select id_client from client2 ) |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 640 messages |
|
| Posté le 18 août 2014 - 16:15 |
Francois C. a écrit : > ne contient pas UNE LISTE de valeurs. |
| |
| |
| | | |
|
| | |
| |
| Posté le 18 août 2014 - 17:01 |
Bonjour, La seule solution est de construire la requête par programmation, en testant chaque valeur avec un NOT LIKE. C'est la preuve d'une mauvaise modélisation de la base de données. Si les valeurs étaient stockées de façon unitaire dans une table liée, et non sous forme de liste dans une seule colonne, la requête serait plus simple à écrire (et accessoirement plus performantes...).
Frédéric.
"Francois C." a écrit dans le message de groupe de discussion : 2014e3a9a71b5df949cf1646892e649b0a75@news.pcsoft.fr...
Bonjour,
Je n'arrive pas a faire une requete :
Je souhaite rechercher tout les enregistrement dont un champ ne contient pas UNE LISTE de valeurs. Cette liste est variable, je ne peux donc pas le saisir manuellement (avec des OU par exemple) . Cette liste est acquise depuis une autre table.
Merci pour vos réponses |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 240 messages |
|
| Posté le 18 août 2014 - 22:21 |
Ce qui est renvoyé par la seconde requête est une liste de valeur que le NOT IN récupère : cela filtrera le champ de ta première table en disant qu'il ne doit pas contenir des valeurs appartenant au même champ de la table 2. Sinon si c'est dans le code que tu dois le faire, tu peux penser à utiliser un paramètre ...
SELECT * FROM client WHERE id_client NOT IN ({Param_ListeVal})
Dans ton code Windev, tu dois envoyer cette liste dans le paramètre de la manière suivante :
REQ_MaRequete.Param_ListeVal = Valeur1;Valeur2;...
Tu peux aussi les stocker dans un tableau (de chaines ou d'entier, comme tu le sens).
REQ_MaRequete.Param_ListeVal = TableauVersChaîne(monTableau,";")
Maintenant je n'ai peut-être pas compris ce que tu cherches à faire... 
-- Vincent |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 640 messages |
|
| Posté le 19 août 2014 - 11:41 |
Bonjour,
@Frédéric DEMILLY : Je suis bien d'accord sur le probleme de conception de base, malheuresuement c'est une base Tiers que je ne peux pas modifier. Je dois donc faire avec :/
@ Vincent Lecomte NOT IN ne permet pas, il me semble, de faire des recherches partielles dans un champs. C'est tout le champ qui est comparé. Moi je souhaite que ne le champ ne contienne pas telle ou telle valeur. |
| |
| |
| | | |
|
| | |
| |
| Posté le 19 août 2014 - 12:02 |
Cette requête fonctionne si la question est: Renvoyer les enregistrements dont la valeur d'un champ N'EST PAS dans une liste de valeurs
Or la demande est: Renvoyer les enregistrements dont la valeur d'un champ NE CONTIENT PAS une liste de valeurs
Donc NOT IN n'est pas utilisable ici.
Il faudrait que François nous clarifie ce point.
Frédéric.
"Vincent Lecomte" a écrit dans le message de groupe de discussion : 2014ff5887fbd2f8dfedf37a6a6f118d43b2@news.pcsoft.fr...
Ce qui est renvoyé par la seconde requête est une liste de valeur que le NOT IN récupère : cela filtrera le champ de ta première table en disant qu'il ne doit pas contenir des valeurs appartenant au même champ de la table 2. Sinon si c'est dans le code que tu dois le faire, tu peux penser à utiliser un paramètre ...
SELECT * FROM client WHERE id_client NOT IN ({Param_ListeVal})
Dans ton code Windev, tu dois envoyer cette liste dans le paramètre de la manière suivante :
REQ_MaRequete.Param_ListeVal = Valeur1;Valeur2;...
Tu peux aussi les stocker dans un tableau (de chaines ou d'entier, comme tu le sens).
REQ_MaRequete.Param_ListeVal = TableauVersChaîne(monTableau,";")
Maintenant je n'ai peut-être pas compris ce que tu cherches à faire... 
-- Vincent |
| |
| |
| | | |
|
| | |
| |
| Posté le 19 août 2014 - 15:13 |
Dans ce cas la seule solution est de construire la requête SQL, en testant chaque valeur avec NOT LIKE. Les indexes n'étant pas utilisables ici, la performance risque fort de ne pas être au rendez-vous...
Frédéric.
"Francois C." a écrit dans le message de groupe de discussion : 2014bca95bc4a0a5b58ca3da556366562ed6@news.pcsoft.fr...
Bonjour,
@Frédéric DEMILLY : Je suis bien d'accord sur le probleme de conception de base, malheuresuement c'est une base Tiers que je ne peux pas modifier. Je dois donc faire avec :/
@ Vincent Lecomte NOT IN ne permet pas, il me semble, de faire des recherches partielles dans un champs. C'est tout le champ qui est comparé. Moi je souhaite que ne le champ ne contienne pas telle ou telle valeur. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 1 640 messages |
|
| Posté le 19 août 2014 - 15:52 |
Non non c'est bien ça.
Je souhaite faire apparaitre uniquement les enregistrements dont le Champ ne CONTIENT PAS une liste de mot.
En français ça donnerait : Afficher uniquement les enregistrement dont le Champ MonChamp ne contient pas "Mot1" ni "Mot2" ni "Mot3" etc...
En attendant, j'ai trouvé une solution "Alternative" qui est de tout sélectionner, et de lire un par un les enregistrements et de faire la sélection par programmation.. les enregistrement répondants aux critères sont donc affichés dans une table mémoire.
Mais ça marche mais ce n'est pas génial |
| |
| |
| | | |
|
| | |