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 :

Petit problème de jointure


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut Petit problème de jointure
    Bonjour,

    Soit la requête ci-dessous qui fonctionne, mais filtre trop (à cause de la clause INNER JOIN), j'aimerai la remplacer par FULL OUTER JOIN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CAmarqueParPorte.idStore, SUM(CAmarqueParPorte.salesNetAmount) AS 2006, sum(CAmarqueParPorte_1.salesNetAmount) AS 2007
    FROM Fournisseur 
    INNER JOIN (CAmarqueParPorte INNER JOIN CAmarqueParPorte AS CAmarqueParPorte_1 ON CAmarqueParPorte.idStore = CAmarqueParPorte_1.idStore) 
    ON (Fournisseur.idMarque = CAmarqueParPorte.idBrand) AND (Fournisseur.idMarque = CAmarqueParPorte_1.idBrand)
    GROUP BY CAmarqueParPorte.idStore
    Hélas je travail sous Access donc la clause FULL OUTER n'existe pas. J'ai vu dans la FAQ que la syntaxe ci-dessous était équivalente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Select ...
    From T1
    Left Outer Join T2
    On...
    Union
    Select ...
    From T2
    Left Outer Join T1
    On...
    Le problème est que j'arrive pas du tout à adapter ma requête à la syntaxe, je débute dans le SQL et j'ai encore beaucoup de mal avec les différents concepts des jointures.

    Quelqu'un voit t'il comment je pourrais transformer ma requête avec l'équivalence du FULL OUTER ?

    D'avance un grand merci !

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CAmarqueParPorte.idStore, SUM(CAmarqueParPorte.salesNetAmount) AS 2006, sum(CAmarqueParPorte_1.salesNetAmount) AS 2007
    FROM Fournisseur 
    LEFT OUTER JOIN (CAmarqueParPorte LEFT OUTER JOIN CAmarqueParPorte AS CAmarqueParPorte_1 ON CAmarqueParPorte.idStore = CAmarqueParPorte_1.idStore) 
    ON (Fournisseur.idMarque = CAmarqueParPorte.idBrand) AND (Fournisseur.idMarque = CAmarqueParPorte_1.idBrand)
    GROUP BY CAmarqueParPorte.idStore

    en plus lisible (et équivalant):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    p1.idStore, 
    SUM(p1.salesNetAmount) AS 2006, 
    sum(p2.salesNetAmount) AS 2007
    FROM Fournisseur  as f
    LEFT OUTER JOIN CAmarqueParPorte  as p1
              ON f.idMarque = p1.idBrand
             AND f.idMarque = p2.idBrand
    LEFT OUTER JOIN CAmarqueParPorte AS p2
            ON p1.idStore = p2.idStore
    GROUP BY p1.idStore

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Salut Mathusalem et merci beacoup pour la réponse !!

    Quand j'exécute ta seconde requête j'ai le message 'erreur de syntaxe, (opérateur absent) dans l'expression ". ' et le curseur se met juste avant le AND

    J'ai remarqué qu'il n'y avait pas l'instruction UNION dans ta requête, je l'ai rajouté comme dans la syntaxe vu sur la FAQ et là j'ai le message : "erreur de syntaxe dans l'opération JOIN".

    C'est étrange quand même.

    et la première j'ai "expression de jointure non supporté"...

    Moi je dis VIVE ACCESS !!!

  4. #4
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    essaye ça alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    p1.idStore, 
    SUM(p1.salesNetAmount) AS 2006, 
    sum(p2.salesNetAmount) AS 2007
    FROM Fournisseur  AS f
    LEFT OUTER JOIN CAmarqueParPorte  AS p1
              ON (f.idMarque = p1.idBrand
             AND f.idMarque = p2.idBrand)
    LEFT OUTER JOIN CAmarqueParPorte AS p2
            ON p1.idStore = p2.idStore
    GROUP BY p1.idStore

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Non mais c'est trop nuuul Access !! J'ai encore un message d'erreur, pourtant ta requête me parait trop cohérente !!

    Voilà le p'tit mot doux qu'il me dit le salopio ! :

    Erreur de syntaxe (opérateur absent) dans l'expression
    '(f.idMarque = p1.idBrand
    AND f.idMarque = p2.idBrand)
    LEFT OUTER JOIN CAmarqueParPorte AS p2
    ON p1.idStore = p2.idStore'

    Je suis sur que sur un autre SGBD sa passe !!

    Merci pour ton soutien en tout cas, j'en ai bien besoin

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Dans votre message d'erreur il n'y a pas de parenthèsage entre les jointures

    Ex : (Table1 LEFT JOIN Table2 ON ....) LEFT JOIN Table3

    et ACCESS est capricieux sur ce point.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Bonjour pepi22 et merci pour votre aide !

    Alors je suis pas sur de mon coup, d'après vos explication j'ai mis les parenthèse ici (elles sont en gras mais on ne les distingues pas très bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
    p1.idStore, 
    SUM(p1.salesNetAmount) AS 2006, 
    sum(p2.salesNetAmount) AS 2007
    FROM (Fournisseur  AS f
    LEFT OUTER JOIN CAmarqueParPorte  AS p1
              ON (f.idMarque = p1.idBrand
             AND f.idMarque = p2.idBrand))
    LEFT OUTER JOIN CAmarqueParPorte AS p2
            ON p1.idStore = p2.idStore
    GROUP BY p1.idStore
    Maintenant j'ai "Erreur de syntaxe dans l'opération JOIN" en me surlignant ce que j'ai souligné dans mon code, si je n'étais pas si bien élevée je dirais haut et fort "FLUTE !!!"

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    La syntaxe me semble exacte dans la requête que vous avez écrite.

    Un simple test :

    Pouvez vous enlevez le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND f.idMarque = p2.idBrand
    de la clause ON de la première jointure pour vérifier si la requête s'execute.

    car je ne remarque rien d'anormal dans la syntaxe de cette requête.

    Ce que vous avez souligner, c'est seulement votre alias P2 ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Bonjouuur !!

    J'espère que votre week end démarre bien !!

    J'ai retiré le AND .... et là sa compile !! Mais ça me fait un produit cartésien (je ne suis pas sure de la définition) donc au lieu d'avoir 20 000 comme résultat pour le premier idStore pour 2006 j'ai 865 000.

    Mais bon tout ça pour dire qu'il veut pas de mon AND... dans la jointure !!!

    J'ai souligné seulement p2 car c'est ce qu'ACCESS me surligne quand j'exécute la requête.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Ca marche !! L'utilisateur Philben à trouvé la solution, voila la requête qui me donne les résultats escomptées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TRANSFORM Sum(CAmarqueParPorte.SalesNetAmount) AS SUMSalesNetAmount
    SELECT CAmarqueParPorte.idStore
    FROM CAmarqueParPorte
    WHERE [Mois]="01" AND ([Annee]="2006" OR [Annee]="2007")
    GROUP BY CAmarqueParPorte.idStore
    PIVOT [Mois] & "/" & [Annee] IN ("01/2006","01/2007");
    Merci à tous de m'avoir aidé !!!

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

Discussions similaires

  1. Un petit problème de jointure externe
    Par vincent.le dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/11/2010, 01h06
  2. Petit problème de jointure
    Par LordBob dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/06/2007, 21h21
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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