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 :

Rechercher un enregistrement à partir d'enregistrements d'une autre table


Sujet :

Langage SQL

  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 Rechercher un enregistrement à partir d'enregistrements d'une autre table
    Bonjour,
    je cherche le moyen en sql de rechercher des enregistrements dans une table à partir d'enregistrements dans une autre table; je m'explique:
    j'ai une table DEVIS avec la colonne IDDEVIS
    j'ai une autre table ELEMENTDEVIS avec les colonnes IDDEVIS (pour relier les deux tables), Référence et CodeArticle;

    je voudrais rechercher tous les devis dont les éléments contiennent une référence ou un code article saisi par un opérateur. Les éléments que je veux récupéré ne sont contenus que dans la table DEVIS.

    Je développe en Windev et j'utilise l'hyperfile réseau ou mono poste et normalement, j'utiliserais les fonctions de parcours des fichiers de données, mais comme j'ai plusieurs critères de recherches, créer une requête sql est plus pratique.

    J'ai recherché du côté des jointures, mais étant novice en sql (survol au niveau scolaire et peu utilisé avec windev), j'ai un peu de mal à comprendre.

    Est-ce que la jointure est déjà une bonne approche et est-ce que je pourrais avoir un exemple de requête répondant à mon problème sachant que de mon côté, j'ai d'autres critères de recherche présents sur la table DEVIS mais également sur d'autres tables?

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

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Il n'y a pas d'enregistrement dans une table. Il y a des lignes et des colonnes. À me lire : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L2
    On n'est pas dans des fichiers !!!

    Oui, la jointure EST la bonne approche.

    A me lire : http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM    DEVIS AS D
            INNER JOIN ELEMENTDEVIS  AS E --> jointure
                  ON D.IDDEVIS = E.IDDEVIS --> condition de jointure
    WHERE ??? --> filtrage sur critère
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  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
    Je te remercie, ton exemple m'a beaucoup aidé.

    Pour l'erreur sur le terme enregistrement, cela vient du fait qu'en windev/hyperfile, les tables sont stockées dans un fichier et donc toutes les lignes d'une table sont appelées 'enregistrement'.

    Par contre, j'ai un soucis, j'ai écrit la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DEVIS.IDDEVIS FROM ((DEVIS INNER JOIN ELEMENTDEVIS ON DEVIS.IDDEVIS = ELEMENTDEVIS.IDDEVIS) INNER JOIN CLIENT ON DEVIS.IDCLIENT = CLIENT.IDCLIENT) WHERE DEVIS.DateDevis BETWEEN '20120101' AND '20121121' AND CLIENT.IDENSEIGNE = '1' AND CLIENT.IDVILLE = '2'
    mais je n'ai aucun résultat, alors que dans ma table DEVIS, j'ai un résultat qui correspond.
    la ligne de DEVIS qui doit correspondre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IDCLIENT = 2
    DateDevis = 20121120
    la ligne de CLIENT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IDCLIENT = 2
    IDVILLE = 2
    IDENSEIGNE = 1
    Qu'est ce qui pourrait poser problème, selon toi?

    J'ai vérifié la syntaxe des INNER JOIN multiples et elle a l'air d'être bonne.

    Merci

    edit:
    je viens de tester avec la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DEVIS.IDDEVIS FROM ((DEVIS INNER JOIN ELEMENTDEVIS ON DEVIS.IDDEVIS = ELEMENTDEVIS.IDDEVIS) INNER JOIN CLIENT ON DEVIS.IDCLIENT = CLIENT.IDCLIENT) WHERE DEVIS.DateDevis BETWEEN '20120101' AND '20121121' AND DEVIS.IDDEVIS = 19
    et j'obtiens bien une réponse. Le problème doit venir de mon INNER JOIN sur la table CLIENT car si je n'utilise pas de filtre sur cette table, ça fonctionne.

    Merci
    Qui vit par le Troll périra par le Troll!

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Beaucoup d'horreur encore dans cette requête :
    • Tu l'as eu ou ton stock de parenthèses ? Tu souhaite en mettre partout ?
    • Utilise des alias de table, c'est plus lisible
    • Indente tes requêtes sinon c'est illisible
    • Trantype tes paramètres avec CAST

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DEVIS.IDDEVIS 
    FROM   DEVIS AS D
           INNER JOIN ELEMENTDEVIS AS ED
                 ON D.IDDEVIS = ED.IDDEVIS
           INNER JOIN CLIENT AS C
                 ON D.IDCLIENT = C.IDCLIENT
    WHERE D.DateDevis BETWEEN CAST('20120101' AS DATE)
                          AND '20121121' 
      AND C.IDENSEIGNE = '1' 
      AND C.IDVILLE = '2'
    Es tu sur que IDENSEIGNE et IDVILLE sont des chaines de caractères ?
    Si ce n'est pas le cas, alors il est stupide de mettre :
    ou
    Car cela oblige le moteur SQL à transtyper tout le contenu de la colonne en chaine et aucun index n'est plus utilisable.
    Si c'est du nombre, il faut spécifier le paramètre en nombre, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      AND C.IDENSEIGNE = 1
      AND C.IDVILLE = 2
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    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
    Merci pour ta réponse,
    entre temps, j'avais testé la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DEVIS.IDDEVIS FROM ((DEVIS INNER JOIN ELEMENTDEVIS ON DEVIS.IDDEVIS = ELEMENTDEVIS.IDDEVIS) INNER JOIN CLIENT ON DEVIS.IDCLIENT = CLIENT.IDCLIENT) WHERE DEVIS.DateDevis BETWEEN '20120101' AND '20121121'AND DEVIS.IDDEVIS = 19 AND CLIENT.IDENSEIGNE = 1 AND CLIENT.IDVILLE = 2
    et cela fonctionne.

    je vais utiliser les différents éléments que tu m'as donné pour rendre la construction de la requête plus lisible.

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

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/12/2014, 22h23
  2. Réponses: 2
    Dernier message: 08/06/2014, 21h48
  3. Réponses: 6
    Dernier message: 09/01/2008, 11h56
  4. Réponses: 11
    Dernier message: 08/01/2008, 11h36
  5. Réponses: 7
    Dernier message: 16/01/2007, 15h54

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