Bonjour a tous, voila c'est pour un exercice de BD pour la gestion d'une bibliothèque
j'ai 2 tables:
Emprunt(Personne, livre, dateEmprunt,DateRetourPrevue, DateRetourEffective) qui contient toutes les informations sur les livres empruntés
et
Retour(Personne, livre, DateEmprunt, Pénalité retard) qui contient toutes les infos sur les livres rendus en retard
il faut ecrire une requete SQL qui donne comme resultat:
Toutes les personnes ayant TOUJOURS rendu en retard les livres qu'elles ont empruntés?
j'ai essayé avec cette requete mais ça me donne les personnes ayant rendu AU MOINS UNE FOIS un livre en retard et pas TOUJOURS comme l'indique l'énoncé....
MA REQUETE: select r.personne from retard r where exists (select e.personne from emprunt e);
Je voudrais savoir comment corriger ma requete pour qu'elle me donne le bon résultat
Help!!! ça fait longtemps que je sèche dessus
Merci beaucoup a ceux qui prendront la peine de me répondre
Publicité
Posté le 24-01-2011 à 15:38:44
Oliiii
Posté le 24-01-2011 à 16:39:20
Voila ce qui devrai te retourner le bon résultat (j'avoue ne pas avoir testé tout a fond):
Code :
SELECT a.Personne
FROM @Emprunt a
LEFTJOIN(
SELECT a.Personne
FROM @Emprunt a
LEFTJOIN @Retour b ON b.Personne = a.Personne AND b.livre = a.livre AND b.dateEmprunt = a.dateEmprunt
WHERE b.Personne ISNULL
GROUPBY a.Personne
) b ON b.Personne = a.Personne
WHERE b.Personne ISNULL
GROUPBY a.Personne
En gros tu selectionnes toutes les personnes qui ont ete au moins une fois a l'heure et tu ne prends que ceux qui restent (qui n'ont forcément jamais ete a l'heure).
siho1990
Posté le 24-01-2011 à 16:50:35
Merci Oliiii mais je viens de tester ce que tu viens de poster ça me sort une erreur pour le join
De plus je ne comprend pas très bien pourquoi tu as eu recours aux jointures LEFT JOIN au lieu des jointures internes "normales"
merci
mrbebert
Posté le 24-01-2011 à 17:53:16
Bizarre le modèle de données On peut tout faire avec la table Emprunt(Personne, livre, dateEmprunt,DateRetourPrevue, DateRetourEffective)
Ceux qui ont rendu au moins une fois un livre à temps :
select distinct Personne
from Emprunt
where DateRetourPrevue >= DateRetourEffective
Donc :
select distinct Personne from Emprunt
where Personne not in (
select distinct Personne
from Emprunt
where DateRetourPrevue >= DateRetourEffective
)
---------------
Doucement le matin, pas trop vite le soir.