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 :

Requête avec jointure complexe


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut Requête avec jointure complexe
    Bonjour,

    Cela fait longtemps que je n'ai pas fait de SQL complexe, et la je bloque.
    Elle est complexe de part la complexité de ma BDD:

    - J'ai 3 tables : COURSE, ASSOCIER_COURSE, STATUT_COURSE
    structure des tables;

    COURSE(Num_course,#Num_demande,...)
    STATUT_COURSE(Num_statut_course,Nom_statut_course)
    ASSOCIER_COURSE(#Num_demande,#Num_course,#Num_statut_course,Date_associer_course)

    1.ASSOCIER_COURSE est une table intermédiaire entre COURSE et STATUT_COURSE, afin de sauvegarder chaque changement de statut à une date j.

    2.Une demande, peut avoir plusieurs courses

    Voici ce que je cherche à faire avec ma requète :

    Je veux afficher dans un datagridview toutes les courses qui sont uniquement au statut 1 ( nom_statut = Ouvert), et pas les courses qui ont qui ont un Num_statut_course à 2,3,4,5,6.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    "Select D.Num_demande as NuméroDemande, AC.Num_course as NuméroCourse, SC.Nom_statut_course as Statut, " & _
            "AC.Num_statut_course as NuméroStatutCourse, AC.Date_associer_course as DateMAJStatut " & _
            "from ASSOCIER_COURSE AC, STATUT_COURSE SC, DEMANDE D, COURSE C " & _
            "where AC.Num_statut_course = SC.Num_statut_course " & _
            "and AC.Num_statut_course = '1' " & _
            "and D.num_demande = C.num_demande " & _
            "and AC.Num_course = C.Num_course " & _
            "and AC.Num_demande = D.Num_demande " & _
            "and C.Num_course Not in ( Select C1.Num_course " & _
            "from ASSOCIER_COURSE AC1, COURSE C1, STATUT_COURSE SC1 " & _
            "where C1.Num_demande = AC1.Num_demande " & _
            "and C1.Num_course = AC1.Num_course " & _
            "and AC1.Num_statut_course = SC1.Num_statut_course " & _
            "and AC1.Num_statut_course = '2' " & _
            "or AC1.Num_statut_course = '3' " & _
            "or AC1.Num_statut_course = '4' " & _
            "or AC1.Num_statut_course = '5' " & _
            "or AC1.Num_statut_course = '6' )"
    La ou sa bloque c'est que dans mon Not in, je peux comparé que un champs : ici Num_course... le resultat est donc qu'il me retire toutes les courses au statut 2,3,4,5,6 sans prendre en compte le Num_demande...
    Je veux que ma requète associe le Num_course au Num_demande qui lui convient.

    Un pti Exemple:

    Ce que j'ai dans ma table ASSOCIER_DEMANDE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Num_demande | Num_course | Num_Statut_course
              1 | 1 | 1
              1 | 2 | 1
              2 | 1 | 1
              2 | 2 | 2
              2 | 3 | 1
    ce que ma requête me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Num_demande | Num_course | Num_Statut_course
              1 | 1
              2 | 1
              2 | 3
    Ainsi il me supprime toutes les lignes ou mon Num_course = 2

    Ce que je souhaite obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Num_demande | Num_course | Num_Statut_course
              1 | 1
              1 | 2 | 1
              2 | 1
              2 | 3
    J'espère avoir été le plus clair possible, Merci par avance de votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je crois que tu pourrais utiliser avantageusement un IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and AC1.Num_statut_course in ( '2', '3', '4' ,'5','6' )
    ou des parenthèses.
    Car A ET B OU C ou D ne donne pas forcément le même résultat que A ET (B ou C ou D)
    Tu pourrais également utiliser une jointure normalisée avec INNER JOIN c'est plus lisible.

    A toi de voir
    Soazig

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Quand on écrit les jointures en respectant la syntaxe normlisée depuis 1992, on trouve parfois des erreurs non visibles en utilisant l'ancienne syntaxe obsolète qui mélange conditions de restriction et de jointure dans la clause WHERE.

    Donc je commence à réécrire ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select D.Num_demande as NuméroDemande, 
      AC.Num_course as NuméroCourse, 
      SC.Nom_statut_course as Statut, 
      AC.Num_statut_course as NuméroStatutCourse, 
      AC.Date_associer_course as DateMAJStatut
    from ASSOCIER_COURSE AC 
    INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course
    INNER JOIN COURSE C ON AC.Num_course = C.Num_course
      INNER JOIN DEMANDE D ON D.num_demande = C.num_demande
    Toutes les tables sont déjà jointes et dans le WHERE, je trouve encore une condition de jointure entre AC et D. Il manque donc une instance de la table DEMANDE.

    Ta requête complètement réécrite defaçon normalisée et remise en forme devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Select D.Num_demande as NuméroDemande, 
      AC.Num_course as NuméroCourse, 
      SC.Nom_statut_course as Statut, 
      AC.Num_statut_course as NuméroStatutCourse, 
      AC.Date_associer_course as DateMAJStatut
    from ASSOCIER_COURSE AC 
    INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course
    INNER JOIN DEMANDE D1 ON AC.Num_demande = D1.Num_demande
    INNER JOIN COURSE C ON AC.Num_course = C.Num_course
      INNER JOIN DEMANDE D2 ON D2.num_demande = C.num_demande
    where AC.Num_statut_course = '1'
      and C.Num_course Not in ( 
        Select C1.Num_course 
        from ASSOCIER_COURSE AC1
        INNER JOIN COURSE C1 ON C1.Num_demande = AC1.Num_demande
          and C1.Num_course = AC1.Num_course
        INNER JOIN STATUT_COURSE SC1 ON AC1.Num_statut_course = SC1.Num_statut_course
        where AC1.Num_statut_course = '2'
          or AC1.Num_statut_course = '3'
          or AC1.Num_statut_course = '4'
          or AC1.Num_statut_course = '5'
          or AC1.Num_statut_course = '6'
      )
    Au passage, Num_statut_course est une clé primaire. C'est donc probablement une colonne de type entier et il est inutile d'entourer les valeurs entières avec des apostrophes.

    Venons-en à ton besoin...
    Je veux afficher dans un datagridview toutes les courses qui sont uniquement au statut 1 ( nom_statut = Ouvert), et pas les courses qui ont qui ont un Num_statut_course à 2,3,4,5,6.
    S'il n'y a que ces 6 statuts, tu cherches donc les courses qui n'ont qu'un seul statut et que ce statut soit 1.

    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Num_demande, Num_course
    FROM ASSOCIER_COURSE
    WHERE Num_statut_course = 1
    GROUP BY Num_demande, Num_course
    HAVING COUNT(*) = 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    Merci à vous deux pour votre réponse rapide

    cinephil, merci pour ta solution toute simple de la fin qui correspond parfaitement à ce que je souhaite faire et merci pour ce petit rappel de requête avec des jointure INNER JOIN, qu'on m'a jamais appris en cours d'ailleur... VIEILLE ECOLE

    J'ai essayé avec la requete INNER JOIN mais mon programme me sors une erreur de synthax... soit lié à la requête ou soit lié à mon SGBD ( BBD : ACCESS, Langage VB.NET)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    req5 = "SELECT D.Num_demande AS NuméroDemande," & _
            " AC.Num_course AS NuméroCourse," & _
            " SC.Nom_statut_course AS Statut," & _
            " AC.Num_statut_course AS NuméroStatutCourse," & _
            " AC.Date_associer_course AS DateMAJStatut" & _
            " FROM ASSOCIER_COURSE AC" & _
            " INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course" & _
            " INNER JOIN DEMANDE D1 ON AC.Num_demande = D1.Num_demande" & _
            " INNER JOIN COURSE C ON AC.Num_course = C.Num_course" & _
            " INNER JOIN DEMANDE D2 ON D2.num_demande = C.num_demande" & _
            " WHERE AC.Num_statut_course = '1'" & _
            " AND C.Num_course NOT IN (Select C1.Num_course" & _
            " FROM ASSOCIER_COURSE AC1" & _
            " INNER JOIN COURSE C1 ON C1.Num_demande = AC1.Num_demande" & _
            " AND C1.Num_course = AC1.Num_course" & _
            " INNER JOIN STATUT_COURSE SC1 ON AC1.Num_statut_course = SC1.Num_statut_course" & _
            " WHERE AC1.Num_statut_course = '2'" & _
            " OR AC1.Num_statut_course = '3'" & _
            " OR AC1.Num_statut_course = '4'" & _
            " OR AC1.Num_statut_course = '5'" & _
            " OR AC1.Num_statut_course = '6')"

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Il est possible que ce soit Access qui râle. Quand tu crées une requête graphiquement avec Access il ajoute un paquet de parenthèses et a une manière très compliquée d'écrire les jointures en imbriquant les JOIN et les ON.

    Peut-être que l'écriture simple et suffisante que j'ai proposée ne lui convient pas.
    Microsoft a toujours été un peu compliqué sur les bords !

    /Mode Joke on
    Il y a éventuellement 6 lettres en trop dans la phrase précédente !
    /Mode Joke off

    Quel message d'erreur est retourné ?

    Si ma dernière requête toute simple convient, pourquoi as-tu repris la requête complexe ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    Le message d'erreur est le suivant :

    Erreur de syntaxe (opérateur absent) dans l'expression 'AC.Num_statut_course = SC.Num_statut_course INNER JOIN DEMANDE D1 ON AC.Num_demande = D1.Num_demande INNER JOIN COURSE C ON AC.Num_course = C.Num_course INNER JOIN DEMANDE D2 ON D2.num_demande = C.num_demande'.


    Le problème c'est que je suis obligé de faire des jointure pour charger mon datagridview avec tous les champs que je désire affiché

    sinon avec la deuxième solution simple, il m'affiche quand même mes courses qui ont on plus de 1 statut...
    Voici la requète avec la solution 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    req5 = "SELECT AC.Num_demande as NuméroDemande, AC.Num_course as NuméroCourse, SC.Nom_statut_course as Statut, " & _
            "AC.Num_statut_course as NuméroStatutCourse, AC.Date_associer_course as DateMAJStatut " & _
            "from ASSOCIER_COURSE AC, STATUT_COURSE SC, DEMANDE D, COURSE C " & _
            "WHERE D.Num_demande = C.Num_demande " & _
            "AND C.Num_demande = AC.Num_demande " & _
            "AND C.Num_course = AC.Num_course " & _
            "AND AC.Num_statut_course = SC.Num_statut_course " & _
            "AND AC.Num_statut_course = '1' " & _
            "GROUP BY AC.Num_demande, AC.Num_course, SC.Nom_statut_course, AC.Num_statut_course, AC.Date_associer_course " & _
            "HAVING COUNT(*) = 1"
    Merci de ton aide

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    C'est peut-être effectivement ce rogntudju d'Access qui est paumé sans ses parenthèses chéries parce que je ne vois rien de manquant à cet endroit dans ma requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM ASSOCIER_COURSE AC
    INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course
    INNER JOIN DEMANDE D1 ON AC.Num_demande = D1.Num_demande
    Il y a bien la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM uneTable alias1
    INNER JOIN table2 alias2 ON condition_de_jointure1
    INNER JOIN table3 alias3 ON condition_de_jointure3
    Par contre, ta dernière requête est de nouveau pourrie avec la syntaxe obsolète !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    Je vois voir si je trouve la synthaxe correct sous access des INNER JOIN.

    C'est drôle quand même car j'ai toujours appris en cours le SQL OLDSCHOOL avec les petites jointures simple... Faut reformer l'éducation national sur les cours de SQL

    Si quelqu'un à une solution à mon problème je suis preneur car la fin de mon projet repose sur cette requête et je dois livrer une première version Fin Janvier

    Merci d'avoir consacré un peu de temps sur mon problème cinephil ^_^

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par leeloo95 Voir le message
    Je vois voir si je trouve la synthaxe correct sous access des INNER JOIN.
    1) Fais une requête graphiquement avec Access en joignant plusieurs tables.
    2) Passe en affichage SQL.
    3) Analyser comment il a placé les parenthèses et "ordonné" à sa manière les JOIN et les conditions de jointure.
    4) Prends du paracétamol pour le mal de tête !

    C'est drôle quand même car j'ai toujours appris en cours le SQL OLDSCHOOL avec les petites jointures simple... Faut reformer l'éducation national sur les cours de SQL
    Si on t'a appris ça tout récemment, c'est que tu as un mauvais prof !
    Tu peux lui indiquer gentiment le lien vers l'artcile de SQLPro qui explique les jointures avec la bonne syntaxe et pourquoi il est préférable de se mettre à cette syntaxe normalisée.

    Si quelqu'un à une solution à mon problème je suis preneur car la fin de mon projet repose sur cette requête et je dois livrer une première version Fin Janvier
    D'ici fin janvier, tu devrais avoir trouvé la bonne requête qui est probablement voisine de celle que tu as faite avec les jointures normalisées.

    Une fois que tu auras résolu l'erreur de syntaxe, si ça ne donne pas le bon résultat, redonne nous la requête, le résultat souhaité et le résultat obtenu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    héhé je suis déjà entrain de tester les INNER JOIN sous ACCESS même ^^

    et j'ai trouvé une solution avec des INNER JOIN EN CASCADE

    J'étudie tout sa correctement et je fait un retour

  11. #11
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    Alors je reviens à l'attaque avec ma synthax correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    req5 = "SELECT AC.Num_demande AS NuméroDemande, " & _
                    "AC.Num_course AS NuméroCourse, " & _
                    "SC.Nom_statut_course AS Statut, " & _
                    "AC.Num_statut_course AS NuméroStatutCourse, " & _
                    "AC.Date_associer_course AS DateMAJStatut " & _
                   "FROM (((((ASSOCIER_COURSE AC " & _
                        "INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course) " & _
                        "INNER JOIN DEMANDE D1 ON AC.Num_demande = D1.Num_demande) " & _
                        "INNER JOIN COURSE C ON AC.Num_course = C.Num_course) " & _
                        "INNER JOIN DEMANDE D2 ON D2.num_demande = C.num_demande)) "
    J'ai simplifié pour le moment... cette requête me retourne mes demandes et les courses associer à la demande. Seulement j'ai un problème de doublons.
    Je me retrouve avec les lignes en double :

    Comme ceci :
    Num_demande | Num_course | Nom_statut | Num_Statut | Date
    1 1 1.Attente enlèvement 1 15/12/2009 12:15
    1 1 1.Attente enlèvement 1 15/12/2009 12:15
    2 1 1.Attente enlèvement 1 15/12/2009 12:15
    2 1 1.Attente enlèvement 1 15/12/2009 12:15

    Avec ma requête simple ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    req5 = "Select D.Num_demande as NuméroDemande, C.Num_course as NuméroCourse,SC.Nom_statut_course as Statut,AC.Date_associer_course as DateMAJCourse, " & _
            "C.Date_enlevement as DateEnlèvement, C.Heure_enlevement as HeureEnlèvement from COURSE C, DEMANDE D, ASSOCIER_COURSE AC,STATUT_COURSE SC " & _
            "where C.Num_demande = D.Num_demande " & _
            "and C.Num_course = AC.Num_course " & _
            "and C.Num_demande = AC.Num_demande " & _
            "and SC.num_statut_course = AC.num_statut_course"
    Mais bon vu que je veux apprendre les INNER JOIN pour dormir moins con... si quelqu'un voit mon problème dans les INNER JOIN

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Je n'ai pas lu tout le sujet, mais dans la requête sans les JOIN vous avez une fois la table DEMANDE, contre deux fois pour l'autre.

    Comme vous ne faites pas les mêmes jointures, vous n'obtenez évidement pas les mêmes résultats.

  13. #13
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    Ah j'ai trouvé je pense : je me perdais dans mes jointures c'est clair ^^

    Merci de ta lumière Waldar

    Voici ma requête correcte avec les INNER JOIN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    req5 = "SELECT AC.Num_demande AS NuméroDemande, " & _
                    "AC.Num_course AS NuméroCourse, " & _
                    "SC.Nom_statut_course AS Statut, " & _
                    "AC.Num_statut_course AS NuméroStatutCourse, " & _
                    "AC.Date_associer_course AS DateMAJStatut " & _
                   "FROM (((ASSOCIER_COURSE AC " & _
                        "INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course) " & _
                        "INNER JOIN COURSE C ON AC.Num_course = C.Num_course and AC.Num_demande = C.Num_demande)) "

  14. #14
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    J'ai un problème avec ma requête finale...

    Message d'erreur :
    Aucune valeur donnée pour un ou plusieurs des paramètres requis.

    J'ai bien un jeu de test dans ma BDD.

    Voici ma requête finale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    req5 = "SELECT AC.Num_demande AS NuméroDemande, " & _
                    "AC.Num_course AS NuméroCourse, " & _
                    "SC.Nom_statut_course AS Statut, " & _
                    "AC.Num_statut_course AS NuméroStatutCourse, " & _
                    "AC.Date_associer_course AS DateMAJStatut " & _
                   "FROM (((ASSOCIER_COURSE AC " & _
                        "INNER JOIN STATUT_COURSE SC ON AC.Num_statut_course = SC.Num_statut_course) " & _
                        "INNER JOIN COURSE C ON AC.Num_course = C.Num_course and AC.Num_demande = C.Num_demande)) " & _
                   "WHERE ASSOCIER_COURSE.Num_statut_course = '1' " & _
                   "AND C.Num_course NOT IN ( Select AC1.Num_course " & _
                            "FROM (((ASSOCIER_COURSE AC1 " & _
                                "INNER JOIN STATUT_COURSE SC1 ON AC1.Num_statut_course = SC1.Num_statut_course) " & _
                                "INNER JOIN COURSE C1 ON AC1.Num_course = C1.Num_course and AC1.Num_demande = C1.Num_demande)) " & _
                            "WHERE AC1.Num_statut_course = '2' " & _
                            "OR AC1.Num_statut_course = '3' " & _
                            "OR AC1.Num_statut_course = '4' " & _
                            "OR AC1.Num_statut_course = '5' " & _
                            "OR AC1.Num_statut_course = '6')"

  15. #15
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    Je reformule ma question car je vous ai peut être perdu...

    j'ai 2 tables :

    - ASSOCIER_COURSE (#Num_demande,#Num_course,#Num_statut_course,Date_associer_course)
    - STATUT_COURSE (Num_statut_course, Nom_statut_course)

    Je veux avoir les courses qui sont uniquement au statut 1 (Nom_statut_course: 1.En attente d'enlèvement) et pas les courses qui peuvent déjà être à un statut supérieur.
    Seulement dans une demande je peux avoir plusieurs course
    Ex:
    Num_demande | Num_course
    1 | 1
    1 | 2
    1 | 3
    2 | 1
    3 | 1

    Voici la requête qui vous montrera au mieux la ou je bloque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT AC.Num_demande, AC.Num_course, AC.Num_statut_course, SC.Nom_statut_course, AC.Date_associer_course
    FROM ASSOCIER_COURSE AS AC, STATUT_COURSE AS SC
    WHERE AC.Num_statut_course = SC.Num_statut_course
    and AC.Num_statut_course = '1'
    and AC.Num_course not in (select AC1.Num_course from ASSOCIER_COURSE AC1
    where AC1.Num_statut_course = '2'
    or AC1.Num_statut_course = '3'
    or AC1.Num_statut_course = '4'
    or AC1.Num_statut_course = '5'
    or AC1.Num_statut_course = '6');
    Le problème c'est que je prends en compte que le Num_course et pas la relation entre le Num_demande et le Num_course.
    Le résultat est que je n'affiche que les course qui ont un statut uniquement à 1, mais par exemple :
    Num_demande | Num_course
    1 | 1
    1 | 2
    2 | 1
    ma requête devrais me retourner :
    2 | 1
    Seulement ma requête va également ne pas afficher cette ligne car pour elle la course 1 à un statut 2 sans prendre en compte le Num_demande.

    J'espère avoir été plus claire ...

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Ton besoin :
    Je veux avoir les courses qui sont uniquement au statut 1 (Nom_statut_course: 1.En attente d'enlèvement) et pas les courses qui peuvent déjà être à un statut supérieur.
    Ma requête donnée quelques messages plus haut et qui, il me semble, répond au besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Num_demande, Num_course
    FROM ASSOCIER_COURSE
    WHERE Num_statut_course = 1
    GROUP BY Num_demande, Num_course
    HAVING COUNT(*) = 1
    Ta réponse suite à cette requête :
    cinephil, merci pour ta solution toute simple de la fin qui correspond parfaitement à ce que je souhaite
    Que te faut-il de plus ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  17. #17
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    cette requête ne réponds pas tout à fait a mon besoin, Exemple :

    dans ma table ASSOCIER COURSE
    Num_demande | Num_course | Num_statut_course
    1 | 1 | 1
    1 | 1 | 2
    1 | 2 | 1
    1 | 3 | 1
    2 | 1 | 1
    3 | 1 | 1
    Ta requête me retourne
    1 | 1 | 1
    1 | 2 | 1
    1 | 3 | 1
    2 | 1 | 1
    3 | 1 | 1

    Le problème c'est que je ne devrais pas avoir cette ligne 1 | 1 | 1 , car ma course 1 de la demande 1 est déjà au statut 2.

    c'est pourquoi je dis : "Je veux avoir les courses qui sont uniquement au statut 1 (Nom_statut_course: 1.En attente d'enlèvement) et pas les courses qui peuvent déjà être à un statut supérieur. "

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Alors essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT a.Num_demande, a.Num_course
    FROM ASSOCIER_COURSE AS a
    WHERE a.Num_statut_course = 1
      AND NOT EXISTS (
        SELECT *
        FROM ASSOCIER_COURSE AS b
        WHERE b.Num_demande = a.Num_demande
          AND b.Num_course = a.Num_course
          AND b.Num_statut_course > 1
      )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  19. #19
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 123
    Points
    123
    Par défaut
    ah ben la c'est nickel chrome

    Merci beaucoup, j'allais modifier ma BDD tellement j'étais dépité ^^

    dis moi c'est quoi la différence entre un NOT IN et un NOT EXISTS?

    En tout cas grand merci, car tu es le seul à m'avoir aidé

  20. #20
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par leeloo95 Voir le message
    dis moi c'est quoi la différence entre un NOT IN et un NOT EXISTS?
    NOT IN = "Pas dans" la liste des valeurs qui sont données derrière.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Nom
    FROM Joueur
    WHERE Etat NOT IN ('Exclu', 'Banni', 'Dégradé')
    NOT EXISTS = "Il n'existe pas" au moins une ligne retournée par la sous-requête.

    On peut mettre une sous-requête avec une seule colonne dans un NOT IN mais je crois que NOT EXISTS est plus rapide.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requête avec jointure externe complexe
    Par dpin33 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/03/2008, 13h41
  2. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  3. Requête avec jointures
    Par Corben dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h55
  4. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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