Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2011, 15h38   #1
Membre régulier
 
Avatar de jubourbon
 
Homme
Inscription : octobre 2008
Messages : 349
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2008
Messages : 349
Points : 96
Points : 96
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 :
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
jubourbon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 15h50   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/10/2011, 16h12   #3
Membre régulier
 
Avatar de jubourbon
 
Homme
Inscription : octobre 2008
Messages : 349
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2008
Messages : 349
Points : 96
Points : 96
Merci, effectivement c'est logique et ça me parait évident maintenant

Pour ceux que ça intéresse voici la syntaxe une fois modifié:
Code :
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
jubourbon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 16h26   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Code :
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/10/2011, 16h15   #5
Membre régulier
 
Avatar de jubourbon
 
Homme
Inscription : octobre 2008
Messages : 349
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2008
Messages : 349
Points : 96
Points : 96
Citation:
Envoyé par skuatamad Voir le message
Code :
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
jubourbon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 16h18   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Ca doit être une limitation Access... Ou peut être avec des parenthèses entourant la condition de jointure.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 16h21   #7
Membre régulier
 
Avatar de jubourbon
 
Homme
Inscription : octobre 2008
Messages : 349
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2008
Messages : 349
Points : 96
Points : 96
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.
jubourbon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 16h59   #8
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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 :
WHERE idproduit=2 OR idproduit IS NULL
Ca devrait faire ce que tu veux.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h24.


 
 
 
 
Partenaires

Hébergement Web