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

Requêtes et SQL. Discussion :

Jointure de 3 tables


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut Jointure de 3 tables
    Bonsoir. je vous présente mon problème. J'ai 3 tables:
    1 - la table chapitres qui se présente comme suit:
    code_chapitre libelle_chapitre
    ----------------------------------
    235 Chapitre 235
    236 Chapitre 236
    247 Chapitre 247
    xyz Chapitre xyz
    Dans cette table tous les code_chapitre sont à 3 caractères.

    2 - la table articles qui est en fait un détail de la précédente et se présente comme suit:
    code_article libelle_article
    ----------------------------------
    235 Chapitre 235
    2361 Chapitre 236-Article 1
    2362 Chapitre 236-Article 2
    2369 Chapitre 236-Article 9

    2478 Chapitre 247-Article 8

    xyz Chapitre xyz
    Comme vous le constater dans cette table les code_article sont soit à 3 caractères soit à 4 caractères.

    3- La 3e table montants contient en fait des montants pour certains éléments de la 2e.
    code_article montant
    ----------------------------------
    235 2 500
    2361 57 800
    2369 42 650


    xyz 9 999
    Lors d'une saisie, l'utilisateur entre un code a 3 chiffres correspondant au données de la 1ere table.

    Je souhaite écrire une requête qui cherche dans la 1e table ce code (exemple 236) . S'il le trouve, il recherche dans la deuxième table tous les éléments correspondants (2361, 2362, 2369) et les montants de ces éléments dans la 3e table (avec 0 s'il n'y a pas de montant dans la 3e table).


    J'ai pensé à des requêtes du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select c.libelle_chapitre , 
    a.code_article, 
    a.libelle_article, 
    m.montant 
    from chapitres c LEFT JOIN articles 
    ON (code_chapitre=MID(a.code_article,1,3)) LEFT JOIN montants m 
    ON (a.code_article=m.code_article)
    Mais j'obtiens une erreur du type "Erreur de syntaxe, opérateur absent dans l'expresion code_chapitre=MID(a.code_article,1,3)...

    Ma première préoccupation c'est l'utilisation de la fonction MID et la seconde la requete peut elle marcher ?

    merci

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Ecarbill,

    Ton soucis vient, à l'origine, d'une erreur de conception.

    Il aurait fallu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    code_chapitre   libelle_chapitre
    235             Chapitre 235
    236             Chapitre 236
    247             Chapitre 247
    xyz             Chapitre xyz
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    code_chapitre   code_article   libelle_article
    236             2              Chapitre 236-Article 2
    236             9              Chapitre 236-Article 9
    247             8              Chapitre 247-Article 8
    qui semble résoudre ton problème, par la même occasion.

    En bref, si tu restes avec tes tables actuelles, tu cours vers de gros ennuis... avec des requêtes "usines à gaz" et, parfois, du code pour contourner ces erreurs de conception.

  3. #3
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut
    Ok, mais il se trouve que certains chapitres non pas de sous éléments (articles) mais se trouves bien dans la table des montants

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 777
    Points : 58 179
    Points
    58 179
    Billets dans le blog
    42
    Par défaut
    Bonsoir,

    après un peu de remise en forme, j’écrirais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT c.libelle_chapitre, 
           a.code_article, 
           a.libelle_article, 
           nz(m.montant,0) as LeMontant 
    FROM   (chapitres c 
           LEFT JOIN articles a
             ON ( c.code_chapitre = Mid(a.code_article, 1, 3) ) )
           LEFT JOIN montants m 
             ON ( a.code_article = m.code_article )

  5. #5
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Ecarbill et Fabien,

    Citation Envoyé par Ecarbill
    Ok, mais il se trouve que certains chapitres non pas de sous éléments (articles) mais se trouves bien dans la table des montants
    ==> rien n'empêche de concevoir cette table comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    code_chapitre  code_article  montant
    235            0              2500
    236            1             57800
    236            9             42650
    
    xyz            0              9999
    ==> si code_article=0, alors il s'agit du prix du chapitre.

    Ceci dit, je ne doute pas que la requête de Fabien fonctionne : je ne l'ai pas testée, mais Fabien a dû s'y atteler.

    Il est toujours dangereux de "faire rentrer" dans un seul attribut (un champ), deux attributs à part entière (deux champs), par concaténation. A terme, tu seras ennuyé (requête de regroupement, analyse croisée, etc...).

    Je te conseille humblement et, néanmoins, fortement de corriger cette anomalie de conception.

  6. #6
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut
    Bonjour a tous et bonne et heureuse année 2012

    Je crois que finalement j'ai changer la conception comme l'a suggéré Richard_35 et maintenant j'ai pu ecrire correctement la requete.

    Merci de vos suggestions

  7. #7
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Ecarbill et bonne année 2012 à toi aussi,

    N'oublies pas le bouton .

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

Discussions similaires

  1. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  2. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  3. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20
  4. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 11h56

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