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 création requete SQL. Difficulté niveau Cas d'école.


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut Problème création requete SQL. Difficulté niveau Cas d'école.
    Bonjour,

    Voila que j'ai dû mal à écrire une requête qui semble vraiment être basique limite un cas d'école.

    Je m'explique, j'ai une table devis contenant trois champs (pour simplifier):
    - un "id" de type int
    - une clé étrangère "client" de type int portant sur la table client
    - une clé étrangère "maitreOeuvre" de type int portant sur la table client

    A savoir que "client" est un champs obligatoire et que "maitreOeuvre" peut être facultatif.

    Dans la table client, on a:
    - un "id" (c'est celui ci qui est utilisé par "client" et "maitreOeuvre" dans devis)
    - un "nom" (VARCHAR)

    Je souhaite récupérer la liste des devis avec le nom du client et le nom du maitreOeuvre.

    Voila, la requête qui me semblait juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT d.id as ref, c1.nom as societe, c2.nom as maitreOeuvre FROM DEVIS d	
    LEFT JOIN CLIENTS c2 on c2.clef = d.MaitreOeuvre
    LEFT JOIN CLIENTS c1 on c1.clef = d.client
    Mais voici ce que le SGBD (Access en l'occurrence me renvoit):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur de syntaxe (opérateur absent) dans l'expression "c2.clef = d.MaitreOeuvre
    LEFT JOIN CLIENTS c1 on c1.clef = d.clien"
    Donc d'après ce message m'a syntaxe est fausse, pourquoi pas je m'incline devant le compilo mais qui est il cet "opérateur absent" .

    J'attends avec impatience vos lumières.
    Et merci d'avance.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Ça n'a peut-être rien à voir mais j'observe
    Citation Envoyé par piscou51000 Voir le message
    - une clé étrangère "maitreOeuvre" de type int portant sur la table client

    ... "maitreOeuvre" peut être facultatif.

    - un "id" (c'est celui ci qui est utilisé par "client" et "maitreOeuvre" dans devis)
    - un "nom" (VARCHAR)

    Je souhaite récupérer la liste des devis avec le nom du client et le nom du maitreOeuvre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LEFT JOIN CLIENTS c2 on c2.clef = d.MaitreOeuvre
    peut-être une sensibilité d'Access à la casse dans les noms de colonnes.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Merci de t'être penché sur la question.
    Mais non ce n'est pas un problème de casse. Access y est insensible.

  4. #4
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,
    Access (quelle version ?) aime les parenthèses, donc j'essaierai en l'aidant à choisir l'ordre des jointures dans l'interprétation. Que donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT d.id AS ref, c1.nom AS societe, c2.nom AS maitreOeuvre FROM 
    (DEVIS d	
    LEFT JOIN CLIENTS c2 ON c2.clef = d.MaitreOeuvre)
    LEFT JOIN CLIENTS c1 ON c1.clef = d.client
    Ou meme mieux, vu que le client est obligatoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT d.id AS ref, c1.nom AS societe, c2.nom AS maitreOeuvre FROM 
    (DEVIS d	
    INNER JOIN CLIENTS c1 ON c1.clef = d.client)
    LEFT JOIN CLIENTS c2 ON c2.clef = d.MaitreOeuvre
    Je penche, donc je suis

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Que dire à part un grand merci...
    Dès à présent, je vais aimer les parenthèses.

    Pour info, j'étais sur Access 12.0.

    Merci pour ton aide.

    Résolu.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Voila que je dois revenir sur cette dites requêtes et l'étendre. Et bien sûr je me fais crier dessus par Access.

    En gros, je viens de me rendre compte (je récupère les données d'une ancienne base de données pour la rendre relationnelle et un peu (beaucoup j'espère) meilleure qu'en ce moment) que les infos qui devrait être dans Devis sont aussi éparpillés dans une table Affaires.

    Tout content de notre collaboration de la dernière fois je me dis: " allez op j'ajoute ma table Affaires dans le FROM et un petit WHERE pour la lier avec Devis" et le tour et jouer.

    Malheureusement, message de Access:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Expression JOIN non supportée
    Voila le code que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT d.id AS ref, a.etat, c1.nom AS societe, c2.nom AS maitreOeuvre FROM Affaires a,
    (DEVIS d	
    INNER JOIN CLIENTS c1 ON c1.clef = d.client)
    LEFT JOIN CLIENTS c2 ON c2.clef = d.MaitreOeuvre
    WHERE a.code = d.id
    Et merci d'avance pour votre aide...

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Pourquoi ne pas garder le style de jointures normalisées ?

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    OK merci de ta réponse.

    Google is my friend... Juste a taper "jointure normalisé" et op un beau tutoriel.
    http://sqlpro.developpez.com/cours/s...ointures/#LIII

    Donc bilan: pas de where à faire mais juste un LEFT JOIN de plus.

    ma solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT d.id AS ref, a.etat, c1.nom AS societe, c2.nom AS maitreOeuvre FROM Affaires a,
    ((DEVIS d	
    INNER JOIN CLIENTS c1 ON c1.clef = d.client)
    LEFT JOIN Affaires a ON a.code = d.id )
    LEFT JOIN CLIENTS c2 ON c2.clef = d.MaitreOeuvre
    Juste une petite question: Comment spécifier le caractère obligatoire pour qu'un devis soit obligatoirement rattaché à une affaire.

    Merci d'avance de vos lumières.

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Comment spécifier le caractère obligatoire pour qu'un devis soit obligatoirement rattaché à une affaire.
    Pour la requête remplacer
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN Affaires a ON a.code = d.id
    par
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN Affaires a ON a.code = d.id
    Pour une obligation de contrainte d'intégrité dans la base elle-même il faut déclarer la colonne correspondant à l'affaire comme clef étrangère dans la table devis.
    Je ne sais pas si Access permet de créer ce genre de contrainte, mais je crois me souvenir que si.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Merci, c'est parfait.

    J'ai trouvé réponse à toutes mes questions.

    Résolu

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

Discussions similaires

  1. Problème avec requete SQL/type NumAuto
    Par Mimisio dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/07/2007, 11h56
  2. problème lancement requete sql
    Par skanderb dans le forum JSF
    Réponses: 4
    Dernier message: 02/05/2007, 16h46
  3. [WD 11] problème de requete SQL-LIKE
    Par fabpeden dans le forum WinDev
    Réponses: 5
    Dernier message: 24/04/2007, 17h07
  4. problème de requete SQL et recherche
    Par franfr57 dans le forum ASP
    Réponses: 1
    Dernier message: 16/03/2006, 13h33
  5. [ACCESS][SQL] Problème avec requete SQL ...
    Par mpascolo dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/11/2005, 10h54

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