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 :

Erreur SQL sur une jointure


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Par défaut Erreur SQL sur une jointure
    Bonjour,

    je travaille sur MySQL 5 (via WAMP) => Chez moi
    je travaille sur MySQL 4 (via WAMP) => au boulot

    ma requete
    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
    24
    SELECT   COMMANDE.ID_EVT,
             COMMANDE.ID_CDE,
             LIGNE_CDE.PU,
             LIGNE_CDE.QUANTITE,
             LIGNE_CDE.REFERENCE,
             LIGNE_CDE.TYPE_PROD,
             LIGNE_CDE.ID_LIGNE_CDE,
             COUNT(STAG_SUIT_EVT.ID_STAG)    AS NB_STAG
     
    FROM     COMMANDE,
             LIGNE_CDE
     
             LEFT OUTER JOIN STAG_SUIT_EVT
               ON STAG_SUIT_EVT.ID_EVT = COMMANDE.ID_EVT
                  AND STAG_SUIT_EVT.IND_PRESENCE = 1
             LEFT OUTER JOIN STAGIAIRE
               ON STAG_SUIT_EVT.ID_STAG = STAGIAIRE.ID_STAG
     
    WHERE    COMMANDE.ID_CDE = 4068
             AND COMMANDE.ID_CDE = LIGNE_CDE.ID_CDE
             AND (STAGIAIRE.ID_MAG = COMMANDE.ID_MAG
                   OR STAGIAIRE.ID_MAG IS NULL)
     
    GROUP BY ID_LIGNE_CDE
    fonctionne au boulot mais pas chez moi !!!


    MYSQL 5 répond
    #1054 - Unknown column 'commande.id_evt' in 'on clause'

    et en bataillant un peu... si j'inverse l'ordre de ma clause 'FROM', ca marche ...
    ca 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
    24
    SELECT   COMMANDE.ID_EVT,
             COMMANDE.ID_CDE,
             LIGNE_CDE.PU,
             LIGNE_CDE.QUANTITE,
             LIGNE_CDE.REFERENCE,
             LIGNE_CDE.TYPE_PROD,
             LIGNE_CDE.ID_LIGNE_CDE,
             COUNT(STAG_SUIT_EVT.ID_STAG)    AS NB_STAG
     
    FROM     LIGNE_CDE,
                COMMANDE
     
             LEFT OUTER JOIN STAG_SUIT_EVT
               ON STAG_SUIT_EVT.ID_EVT = COMMANDE.ID_EVT
                  AND STAG_SUIT_EVT.IND_PRESENCE = 1
             LEFT OUTER JOIN STAGIAIRE
               ON STAG_SUIT_EVT.ID_STAG = STAGIAIRE.ID_STAG
     
    WHERE    COMMANDE.ID_CDE = 4068
             AND COMMANDE.ID_CDE = LIGNE_CDE.ID_CDE
             AND (STAGIAIRE.ID_MAG = COMMANDE.ID_MAG
                   OR STAGIAIRE.ID_MAG IS NULL)
     
    GROUP BY ID_LIGNE_CDE
    je ne comprends pas ...

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Quitte à écrire en SQL normatif (ce qui est bien) il faut le faire jusqu'au bout (et vos problèmes disparaîtront) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT ...
    FROM
        COMMANDE
        INNER JOIN LIGNE_CDE
          ON LIGNE_CDE.ID_CDE = COMMANDE.ID_CDE
        LEFT OUTER JOIN STAG_SUIT_EVT
          ON STAG_SUIT_EVT.ID_EVT = COMMANDE.ID_EVT
         AND STAG_SUIT_EVT.IND_PRESENCE = 1
        LEFT OUTER JOIN STAGIAIRE
          ON STAGIAIRE.ID_STAG = STAG_SUIT_EVT.ID_STAG
         AND STAGIAIRE.ID_MAG = COMMANDE.ID_MAG
    WHERE
        COMMANDE.ID_CDE = 4068
    GROUP BY ...

  3. #3
    Membre émérite Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Par défaut
    merci pour votre réponse.

    je venais en effet de lire dans le cours de SQLPro que la syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ...
    FROM   <table gauche>
           LEFT | RIGHT | FULL OUTER JOIN <table droite 1>
                ON <condition de jointure>
           [LEFT | RIGHT | FULL OUTER JOIN <table droite 2>
                ON <condition de jointure 2>]
    ...
    du coup, je vois qu'en effet, je ne respecte pas la norme
    (et donc MySQL 4 me laisse tranquille mais pas MySQL 5 ...) (Pourquoi est-ce qu'on me dit jamais rien à moi ... )

    mais j'ai l'impression que ca risque d'etre compliqué parfois de respecter la norme jusqu'au bout ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ...
    FROM
        COMMANDE
        INNER JOIN LIGNE_CDE
          ON LIGNE_CDE.ID_CDE = COMMANDE.ID_CDE
    est la jointure Interne (avant toutes 2 dans la clause FROM)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM
        COMMANDE
        LEFT OUTER JOIN STAG_SUIT_EVT
          ON STAG_SUIT_EVT.ID_EVT = COMMANDE.ID_EVT
         AND STAG_SUIT_EVT.IND_PRESENCE = 1
    est la premiere jointure Externe (ne faut-il pas mettre la seconde condition dans la clause WHERE ??)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM
        COMMANDE
        LEFT OUTER JOIN STAGIAIRE
          ON STAGIAIRE.ID_STAG = STAG_SUIT_EVT.ID_STAG
         AND STAGIAIRE.ID_MAG = COMMANDE.ID_MAG
    est la seconde jointure Externe
    MAIS autant c'est correct pour "STAGIAIRE.ID_MAG = COMMANDE.ID_MAG"
    autant "STAGIAIRE.ID_STAG = STAG_SUIT_EVT.ID_STAG" n'est pas concerné par la jointure COMMANDE <=> STAGIAIRE

    Est-ce qu'on est bien normalisé dans ce cas la ??

    merci

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 818
    Billets dans le blog
    14
    Par défaut
    Commençons par rendre la requête de Waldar plus lisible en mettant des alias sur les tables et en n'allant pas trop souvent à la ligne.
    Ensuite, ne pas mélanger les clauses de jointure et les restrictions sur les données, et mélangeons encore moins les clauses de jointures entre elles !
    Ca devrait donner :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT ...
    FROM COMMANDE c
    INNER JOIN LIGNE_CDE lc ON lc.ID_CDE = c.ID_CDE
    LEFT OUTER JOIN STAG_SUIT_EVT sse ON sse.ID_EVT = c.ID_EVT
        LEFT OUTER JOIN STAGIAIRE s1 ON s1.ID_STAG = sse.ID_STAG
    LEFT OUTER JOIN STAGIAIRE s2 ON s2.ID_MAG = c.ID_MAG
    WHERE c.ID_CDE = 4068
        AND sse.IND_PRESENCE = 1
    GROUP BY ...
    En fait il manquait une jointure. La table STAGIAIRE est jointe d'une part à STAG_SUIT_EVT et d'autre part à COMMANDE. Il faut donc la faire figurer deux fois avec des alias différents.
    Enfin, c'est ce que je déduis de la lecture de la requête ! Sans modèle de données, c'est pas forcément évident.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

Discussions similaires

  1. Problème d'erreur SQL avec une DB2 sur un AS400
    Par Baboulinet_ dans le forum Langage
    Réponses: 1
    Dernier message: 11/10/2011, 11h14
  2. Une question aux Grands du Sql, sur les jointures externes
    Par tonton67 dans le forum Développement
    Réponses: 3
    Dernier message: 26/01/2009, 09h08
  3. Réponses: 2
    Dernier message: 21/10/2008, 13h57
  4. [VB.Net] Pourquoi ai-je une Erreur SQL sur un update ?
    Par ndsaerith dans le forum Accès aux données
    Réponses: 3
    Dernier message: 03/08/2006, 11h32
  5. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55

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