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

Langage SQL Discussion :

Problème avec requète SQL multi-tables pour recherche multi-critères


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut Problème avec requète SQL multi-tables pour recherche multi-critères
    Bonjour,

    Voici mes tables :

    • APPLICATION dans laquelle on trouve les champs Application_Id et Description_Anglaise
    • DESSINS dans laquelle on trouve les champs Dessin_Id et DESSIN
    • CLIENTS dans laquelle on trouve les champs Client_Id et CLIENT
    • TECHNOLOGIE dans laquelle on trouve les champs Technologie_Id et Description_Anglaise
    • BANQUE qui est la table qui relie tout. Il y a les champs suivant : Main_Id, Application_Id, Client_Id , Dessin_Id et Technologie_Id


    Maintenant voici ma requête:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    requete = "SELECT * FROM BANQUE AS banque, DESSINS AS dessin, APPLICATION AS application, CLIENTS As client, TECHNOLOGIE As technologie WHERE"
    If MainForm.cmbNomClient.Text <> "" Then requete = requete & " banque.Client_Id = client.Client_Id AND banque.Dessin_Id = dessin.Dessin_Id AND CLIENT LIKE '" & MainForm.cmbNomClient.Text & "'"
    If MainForm.cmbApplication.Text <> "" Then requete = requete & " AND banque.Application_Id = application.Application_Id AND banque.Dessin_Id = dessin.Dessin_Id AND application.Description_Anglaise LIKE '" & MainForm.cmbApplication.Text & "'"
    If MainForm.cmbAccessoires.Text <> "" Then requete = requete & " AND banque.Technologie_Id = technologie.Technology_Id AND banque.Dessin_Id = dessin.Dessin_Id AND technologie.Description_Anglaise LIKE  '" & MainForm.cmbTechnologie.Text & "'"
    La requête ne plante pas, mais je n'obtiens pas l'affichage désiré. En fait, si je demande d'afficher les dessin en fonction des clients, ceux-ci s'affichent en triple. Par exemple, au lieu d'avoir un seul dessin, j'ai trois fois le même qui s'affiche.
    J'ai tout essayé et j'aurais besoin d'un coup de main.

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonsoir

    Vous faites des select * du coup vous avez à minima toutes vos colonnes de jointures en plusieurs exemplaires, et probablement plein de colonnes inutiles, commencez par coder en citant explicitement les colonnes requises, ca limitera les erreur, et rendra votre résultat stable quelque soient les évolutions de vos tables, sans compter le temps de traitement économisé à ne pas transporter des octets inutiles

    Postez vos requetes entre les balises code (icone # de la barre d'outils), ça facilitera la lecture

    Les champs c'est dans les formulaires, dans les tables se trouvent des colonnes

    Indiquez quels sont les index de vos tables, afin que les solution proposées soient viables

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Parfait c'est noté!
    Vous avez raison je voulais plutôt dire colonne et même attributs de mes tables...
    Je vais corriger le tout et faire un simple Select. Si ça ne fonctionne pas, je vous reviens!


    Merci beaucoup.

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    serait-il possible de me donner une piste ? J'ai pas mal tout essayé et ça ne fonctionne toujours pas. Je présume que je dois utiliser des INNER JOIN. J'ai choisi d'utiliser le INNER JOIN, car je veux obtenir seulement mes données qui ont une correspondance entre mes tables. Pour la suite rient ne va plus. En fait, je ne sais pas ou mettre ma table BANQUE dans la requête suivante. Je suis vraiment perdue, j'ai peu d'expérience.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     requete = "SELECT  p.DESSIN DESSINS, j.CLIENT CLIENTS FROM CLIENTS j INNER JOIN DESSINS p ON p.Client_Id = j.Client_Id WHERE j.CLIENT LIKE & '" & MainForm.cmbNomClient.Text & "'"
    Je sais que ça ne fonctionne pas car je dois passer par BANQUE et que celle-ci n'est même pas évoquer dans ma requête...bref, je suis incapable de traduire la requête.

    Voilà ce que j'aimerais faire:

    J'aimerais obtenir les dessins de ma table dessins en fonction du client dans ma table client. Je rappelle que la table BANQUE relie tout. Après coup, je ne sais pas comment traduire la dernière requête que je vous aie envoyé.
    Raisonnement: Je dois passer par l'id client (Client_Id) de la table BANQUE et ensuite pointer sur l'attribut CLIENT de la table CLIENTS et ensuite je veux passer par l'Id dessin (Dessin_Id) de ma table BANQUE et ensuite pointer sur l'attribut DESSIN de ma table DESSINS et ma condition permet de trouver les données de ma tables DESSINS qui correspondent au client choisi par l'utilisateur, soit la valeur du combobox.

    Merci de me répondre.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Est-ce que ceci vous convient ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  DISTINCT 
            Dessin_Id
           ,Dessin
    FROM Dessin
    WHERE Dessin_Id in
         (SELECT Dessin_Id
          FROM banque
          WHERE Client_Id = client_saisi_par_utilisateur)

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Déjà vous m'avez donné un bon coup de pouce.

    La seule chose qui ne fonction pas c'est que l'idClient retourne un numéro d'id et nom pas le nom client donc j'obtiens cette erreur : "Data type mismatch in criteria expression". Mon objectif est d'accéder aux valeurs de la colonne CLIENT de la table CLIENTS.

    Ça revient un peu au problème que j'avais...je ne vois pas comment tout mettre en relation. La requête dit : je prends l'id dessin de ma table DESSIN ou le Dessin_Id dans ma TABLE CAPACITORBANK a un Id client qui correspond à ' unNomDeClient'.

    Toutefois, ce n'est pas l'Id qui correspond au nom de client, c'est la colonne CLIENT de la table CLIENTS. Bref, je ne sais pas comment organiser la requête et pointer sur l'attribut CLIENT de ma table CLIENTS. Comment faire plusieurs from dans la requête?

    J'ai essayé un truc comme ça mais évidemment ce ne doit pas être la bonne syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            requete = "Select DISTINCT Dessin_Id ,DESSIN FROM DESSINS WHERE Dessin_Id in (SELECT Dessin_Id FROM BANQUE(SELECT Client_Id FROM CLIENTS WHERE CLIENT = '" & MainForm.cmbNomClient.Text & "'))"
    Merci de me répondre,

    Alex.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Si votre utilisateur saisit non pas un code client (id) mais un nom, alors vous risquez d'avoir des doublons et vous allez sélectionner les dessins de M. Dupond n° 125 et M. Dupond N° 678*
    Bien sur vous pouvez choisir d'afficher la liste des dessins de tous les MM. Dupond, mais Est-ce souhaitable (liste rallongée à tort, problème de confidentialité...)
    Il serait préférable de demander la saisie par identifiant unique

    S'il n'y a aucun doublon de nom (peu probable, surtout sur la durée) vous pouvez faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  DISTINCT 
            Dessin_Id
           ,Dessin
    FROM Dessin
    WHERE Dessin_Id in
         (SELECT BQ.Dessin_Id
          FROM banque BQ
          INNER JOIN Client CL
             ON CL.Client_Id = BQ.Client_Id
          WHERE CL.Client = Nom_client_saisi)

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Ok merci je vais essayer ça. Je comprends parfaitement ce que vous me dites et je suis d'accord. S'agit-il d'un problème de conception avec les tables? Aurait-il eu une autre manière de procéder?

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Non, on ne peut pas en déduire un problème de modélisation

    Le plus simple il me semble, est que l'application demande soit la saisie du n° du client, soit la saisie du nom, mais qu'en ce cas, la liste des clients correspondants au nom saisi soit affichée avec des infos supplémentaires (prénom, numéro de sécu...), permettant à l'utilisateur de sélectionner une seule ligne et donc un identifiant, identifiant qui sera utilisé dans la requête telle que celle que je vous ai communiqué dans mon post n°5 de ce matin 9h00.

  10. #10
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Parfait je comprends, c'est noté. Merci beaucoup pour votre, c'est très apprécié.

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Pensez à passer le sujet en "résolu" si c'est le cas, et à voter + si les réponses on pu vous aider

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    en fait ce que je cherche à faire depuis les derniers jours c'est une recherche multicritères. Le code de mon premier post représente bien ce que je veux faire avec mes conditions If et les AND clause.

    J'ai essayé le code et j'ai la présence de doublon...j'obtiens cette erreur "At most one record can be returned by this subquery"

    Pourtant, si j'utilise le Id_Dessin, il y a seulement un dessin qui peut avoir ce client et ce type d'application. Tous les dessins sont uniques.

    Par exemple, j'aurai le dessin #60 avec comme idClient #47 et enfin l'application #1 ou le dessin #61 avec comme idClient #47 et enfin l'application #1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        requete = "Select DISTINCT Dessin_Id, DESSIN FROM DESSINS WHERE Dessin_Id in"
            If MainForm.cmbNomClient.Text <> "" Then requete = requete & " (SELECT BQ.Dessin_Id FROM BANQUE BQ INNER JOIN CLIENTS CL ON CL.Client_Id = BQ.Client_Id WHERE CL.CLIENT = '" & MainForm.cmbNomClient.Text & "')"
            If MainForm.cmbApplication.Text <> "" Then requete = requete & " AND (SELECT BQ.Dessin_Id FROM BANQUE BQ INNER JOIN APPLICATION A ON A.Application_Id = BQ.Application_Id WHERE A.Description_Anglaise LIKE '" & MainForm.cmbApplication.Text & "')"
     
            requete = requete & ""
            MsgBox(requete)
    Voilà je ne sais pas du tout comment m'y prendre. Devrais-je refaire mes tables?

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Exécutez seules chacune des 2 requêtes imbriquées en remplaçant votre variable par la valeur saisie pour vérifier les Id qui sont renvoyés

    Si le même Id apparait plusieurs fois dans l'une ou l'autre, ajoutez simplement distinct dans la requête concernée

    Il manque un bout de code dans votre 2ème construction, ajoutez ce que j'ai mis en couleur ci-dessous (attention au % peu visible à la fin, à ajouter aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AND DwgName_Id in   
       (SELECT BQ.DwgName_Id 
        FROM       CAPACITORBANK BQ 
        INNER JOIN APPLICATION A 
           ON A.Application_Id = BQ.Application_Id 
        WHERE A.Description_Anglaise LIKE '" & MainForm.cmbApplication.Text & "%')"

  14. #14
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    j'ai encore une question, si je voudrait retourner le voltage et le nom de mon dessin comment je remanierais ma requête?

    J'ai essayer plusieurs choses qui me donnaient différentes erreur. Voici ce que j'ai codé qui fonctionne, mais ne me retourne pas le résultat attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Dim requete = "SELECT DISTINCT Dessin_Id, DESSIN, Voltage FROM DESSINS, BANQUE WHERE "
            If MainForm.cmbNomClient.Text <> "" Then requete = requete &
                " Dessin_Id in (SELECT DISTINCT BQ.DessinId FROM BANQUE BQ INNER JOIN CLIENTS CL ON CL.Client_Id = BQ.Client_Id  WHERE CL.CLIENT LIKE '" & MainForm.cmbNomClient.Text & "%') AND "
            If MainForm.cmbApplication.Text <> "" Then requete = requete &
                "Dessin_Id in (SELECT DISTINCT BQ.DessinId FROM BANQUE BQ INNER JOIN APPLICATION A ON A.Application_Id = BQ.Application_Id WHERE A.Description_Anglaise LIKE '" & MainForm.cmbApplication.Text & "%') AND "
             If MainForm.cmbVoltage.Text <> "" Then requete = requete &
                "DwgName_Id in(SELECT DISTINCT BQ.DessinId FROM BANQUE BQ INNER JOIN VOLTAGE V ON V.Voltage_Id = BQ.Voltage_Id WHERE V.Description_Anglaise LIKE '" & MainForm.cmbVoltage.Text & "%') AND "
     
      requete = requete & " ''"
            Return requete

    Voici ce que j'obtiens en sortie:

    dessin1 nom1 path1 3,456 Kv
    dessin1 nom1 path1 4 Kv
    ...

    l'affichage du voltage est okay mais les résultats ne font pas de sens avec le dessin choisi.

    Merci de me répondre,

    Alex.

  15. #15
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Finalement, j'ai choisi de modifier ma table DESSIN et d'y ajouter les attributs puissance et voltage. Je peux maintenant y accéder en utilisant la requête ci-haut.

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

Discussions similaires

  1. [SQL] Problème avec requête SQL
    Par Kenya dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/01/2008, 22h13
  2. Problème avec requête SQL dans VBA
    Par Mimisio dans le forum VBA Access
    Réponses: 10
    Dernier message: 13/07/2007, 11h00
  3. [SQL] problème avec requête sql
    Par belakhdarbts10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/05/2007, 11h58
  4. probléme avec requête SQL
    Par richard60 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/03/2007, 18h18
  5. Problème avec requête SQL avec variables
    Par harry25 dans le forum ASP
    Réponses: 1
    Dernier message: 03/01/2007, 03h41

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