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 :

Requête Jointure externe retournant 0 si pas de liaison


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Points : 189
    Points
    189
    Par défaut Requête Jointure externe retournant 0 si pas de liaison
    Bonjour,

    Voici le schéma de ma base:
    Calendrier(IDJour, DateDuJour)
    Vente(IDVente, DateVente, Quantite, #IDProduit)

    Je souhaite faire une requête qui me renvoi toutes les dates, avec les quantité de vente du produit ayant l'id '2'
    J'ai lu le cours sur les jointures externes (ici et voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Calendrier.DateDuJour, Vente.Quantite
    FROM Calendrier Left OUTER JOIN Vente ON Calendrier.DateDuJour= Ventes.DateVente
    Where idproduit=2
    Mais celle ci ne me retourne que les date ayant eu une vente, et je souhaiterais que sur les dates ou il n'y a pas de vente correspondante il me retourne 0.

    Je ne sais pas trop comment faire.

    Merci d'avance pour votre aide.

    Petite précision cette requête est exécutée sur Access 2003

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    le IDPRODUIT=2 fait partie de la jointure externe.

    Il faut donc le mettre dans le ON et non le WHERE.

    En effet, une fois qu'on est dans le WHERE, alors on a la liste des lignes retournée par la jointure INNER, complétées par les lignes manquantes, dont tous les champs de VENTE sont à null, y compris IDPRODUIT.

    Donc un filtre sur IDPRODUIT dans le where va de facto virer toutes les valeurs NULL, et donc la requête revient à faire un INNER JOIN.

    J'espère que pour vous c'est plus clair maintenant.

  3. #3
    Membre habitué Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Points : 189
    Points
    189
    Par défaut
    Merci, effectivement c'est logique et ça me parait évident maintenant

    Pour ceux que ça intéresse voici la syntaxe une fois modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select Calendrier.DateJour, db1.Quantite
    from Calendrier
    Left outer join (SELECT ventes.DateVente, ventes.Quantite
    FROM ventes
    WHERE ventes.IDProduit=2) as db1
    on Calendrier.DateJour=db1.DateVente

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Calendrier.DateDuJour, Vente.Quantite
      FROM Calendrier 
      LEFT OUTER JOIN Vente ON Calendrier.DateDuJour= Ventes.DateVente AND Vente.idproduit=2
    suffit.
    Jointure externe et condition de restriction.

  5. #5
    Membre habitué Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Points : 189
    Points
    189
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Calendrier.DateDuJour, Vente.Quantite
      FROM Calendrier 
      LEFT OUTER JOIN Vente ON Calendrier.DateDuJour= Ventes.DateVente AND Vente.idproduit=2
    suffit.
    Jointure externe et condition de restriction.
    Access me refuse ta syntaxe et me renvoie : Expression de jointure non supportée

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Ca doit être une limitation Access... Ou peut être avec des parenthèses entourant la condition de jointure.

  7. #7
    Membre habitué Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Points : 189
    Points
    189
    Par défaut
    J'ai essayé il veut rien entendre. Ma requête imbriquée fonctionne, c'est peut être pas le top, mais ça fera l'affaire.

    Merci pour ton aide.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    En effet Access est un peu crétin, et refuse les contantes dans les critères de jointure.
    Du coup on est obligé de mettre le 2 dans le where.

    Tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where idproduit=2 or idproduit is null
    Ca devrait faire ce que tu veux.

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

Discussions similaires

  1. Requête avec jointure qui retourne null si pas de valeur
    Par jubourbon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/09/2011, 11h10
  2. Jointure externe qui ne fonctionne pas
    Par juvamine dans le forum SQL
    Réponses: 6
    Dernier message: 28/10/2008, 11h26
  3. Réponses: 11
    Dernier message: 16/12/2006, 15h34
  4. [Débutant]Soucis requête jointure externes (8-i)
    Par jdotti dans le forum Oracle
    Réponses: 7
    Dernier message: 14/10/2005, 15h39
  5. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26

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