IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

requete avec clause IN [WD19]


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut requete avec clause IN
    Bonjour,
    j'ai développé une application de gestion de clients, chaque client a des informations classiques (nom, adresse, ville, pays, ...) et une liste de tags qui lui sont associés.

    J'ai créé une requête pour rechercher tous les clients dont les informations et les tag correspondent à une valeur saisie. La recherche dans les informations du client fonctionne mais la recherche dans les tags rencontre un problème

    voici la requête que j'ai créée
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT CLIENT.IDCLIENT FROM CLIENT WHERE CLIENT.Supp = '0' AND (CLIENT.IDCLIENT IN (SELECT IDCLIENT FROM TAG WHERE TAG.NomTag = 'salon'))
    j'ai simplifié la requête pour qu'il n'y ait que la partie qui pose problème.

    Avec cette requête, j'obtiens l'erreur "le fichier TAG n'existe pas" alors que si je fais la requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT IDCLIENT FROM TAG WHERE TAG.NomTag = 'salon'
    j'obtiens les bons résultats.

    Qu'est-ce qui pourrait poser le problème? Est-ce qu'il y a des limitations dans le centre de contrôle HyperFileSQL et que l'on ne pourrait pas faire de sous requêtes?

    Je vous remercie.
    Qui vit par le Troll périra par le Troll!

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Bonjour,

    Pourquoi une sous-requête ?
    Je verrai plutôt :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT CLIENT.IDCLIENT FROM CLIENT 
    INNER JOIN TAG ON TAG.IDCLIENT = CLIENT.IDCLIENT
    WHERE CLIENT.Supp = '0' AND TAG.NomTag = 'salon'

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    Bonjour,
    je te remercie pour ta réponse. Çà fonctionne bien

    Par contre je suis confronté à un autre problème, si je veux rechercher avec deux tags: si je reprends mon ancienne requête pour rechercher les clients qui étaient présents au salon de l'aviation par exemple, voici la requete
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT CLIENT.IDCLIENT FROM CLIENT 
    INNER JOIN TAG ON TAG.IDCLIENT = CLIENT.IDCLIENT
    WHERE CLIENT.Supp = '0' AND TAG.NomTag = 'salon' AND TAG.NomTag = 'aviation'
    cette requête ne me retourne aucune réponse et si j'utilise un OR au lieu d'un AND, j'obtiens tous les clients qui ont au moins un des deux tags.

    Comment je peux faire pour n'obtenir que ceux qui ont les deux tags?

    pour info, mon fichier TAG est décrit comme cela:
    IDTAG (identifiant automatique)
    IDCLIENT
    NomTag

    Je vous remercie
    Qui vit par le Troll périra par le Troll!

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 050
    Points : 9 386
    Points
    9 386
    Par défaut
    En faisant cela , tu recherches les lignes qui sont à la fois 'salon' et 'aviation' ...
    C'est un peu comme si tu cherchais les individus qui blonds , mais qui sont aussi roux... aucune ligne renvoyée.

    Voici la requête.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT CLIENT.IDCLIENT FROM CLIENT 
    INNER JOIN TAG ON TAG.IDCLIENT = CLIENT.IDCLIENT
    WHERE CLIENT.Supp = '0' AND ( TAG.NomTag = 'salon' or TAG.NomTag = 'aviation')

    Ou encore

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT CLIENT.IDCLIENT FROM CLIENT 
    INNER JOIN TAG ON TAG.IDCLIENT = CLIENT.IDCLIENT
    WHERE CLIENT.Supp = '0' AND  TAG.NomTag in (  'salon' , 'aviation')
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Si tu veux les clients qui ont les deux tags, tu as (au moins) deux solutions:
    • Soit faire deux jointures avec la table TAG
    • Soit utiliser un IN, et un comptage


    Je suis plutôt pour la deuxième solution, qui ressemble à ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CLIENT.IDCLIENT,count(*)
    FROM CLIENT 
    INNER JOIN TAG ON TAG.IDCLIENT = CLIENT.IDCLIENT
    WHERE CLIENT.Supp = '0' AND TAG.NomTag in ('salon','aviation')
    group by CLIENT.IDCLIENT
    having count(*) = 2
    En rendant paramétrable la liste de valeurs et le "résultat" du count, tu peux aussi chercher par exemple les clients qui ont au moins 2 tags dans une liste de 3:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CLIENT.IDCLIENT,count(*)
    FROM CLIENT 
    INNER JOIN TAG ON TAG.IDCLIENT = CLIENT.IDCLIENT
    WHERE CLIENT.Supp = '0' AND TAG.NomTag in ('salon','aviation','Bourget')
    group by CLIENT.IDCLIENT
    having count(*) >= 2

    En remplaçant >= par =, tu auras les clients qui ont exactement 2 tags parmi les 3 indiqués.

    Tatayo.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    Bonjour,
    je te remercie pour ta réponse, ça fonctionne.

    c'est exactement ce dont j'avais besoin.
    Qui vit par le Troll périra par le Troll!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete SQL clause WHERE avec variable
    Par gabule dans le forum JDBC
    Réponses: 6
    Dernier message: 09/01/2019, 11h04
  2. Requete avec clause where dynamique
    Par shyangel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/05/2011, 13h10
  3. Requete avec clause max
    Par MASSAKA dans le forum Sybase
    Réponses: 6
    Dernier message: 09/12/2009, 13h42
  4. requetes avec clause max
    Par MASSAKA dans le forum Sybase
    Réponses: 15
    Dernier message: 03/12/2009, 17h56
  5. [MySQL] Afficher le resultat d'une requete avec clause
    Par spawns dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/01/2009, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo