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 24/01/2011, 15h55   #1
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Par défaut requete SQL qui ne donne pas le bon résultat?

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:
Code :
1
2
3
4
5
6
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
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 16h10   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

Je partirai sur l'inverse de la proposition pour retomber sur mes pattes je penses.

C-a-d trouver les gens qui n'ont jamais rendu de livre en retard (EXCEPTION JOIN), et entourer tout ceci par une non existence de cet ensemble dans emprunt (NOT EXISTS).

Ce qui fait quand même 3 jointures.

edit: en fait non pas d'edit.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 16h10   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
TOUJOURS signifie que le nombre de retards de la personne est égal au nombre d'emprunts de cette personne.

Tourne-toi du côté de COUNT et de GROUP BY...
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 16h12   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Pour reformuler, tu cherches les personnes:
Qui ont rendu des livres en retard
Qui n'ont pas rendu de livre "à temps"

Je verrai quelquechose du genre:

Autre solution:
Code SQL :
1
2
3
4
5
6
7
8
 
SELECT DISTINCT personne
FROM emprunt
WHERE DateRetourPrevue < DateRetourEffective
except
SELECT DISTINCT personne
FROM emprunt
WHERE DateRerourPrevue >= DateRetourEffective

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 16h59   #5
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par punkoff Voir le message
Bonjour,

Je partirai sur l'inverse de la proposition pour retomber sur mes pattes je penses.

C-a-d trouver les gens qui n'ont jamais rendu de livre en retard (EXCEPTION JOIN), et entourer tout ceci par une non existence de cet ensemble dans emprunt (NOT EXISTS).

Ce qui fait quand même 3 jointures.

edit: en fait non pas d'edit.
oui sauf que le contraire de toujours ce n'est pas jamais mais "au moins une fois"!
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h04   #6
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par tatayo Voir le message
Bonjour,
Pour reformuler, tu cherches les personnes:
Qui ont rendu des livres en retard
Qui n'ont pas rendu de livre "à temps"

Je verrai quelquechose du genre:

Autre solution:
Code SQL :
1
2
3
4
5
6
7
8
 
SELECT DISTINCT personne
FROM emprunt
WHERE DateRetourPrevue < DateRetourEffective
except
SELECT DISTINCT personne
FROM emprunt
WHERE DateRerourPrevue >= DateRetourEffective

Tatayo.
donc en fait tu enleve les personnes qui n'ont pas rendu en retard des personnes qui ont rendu en retard, mais la probleme,je crois, est que si une personne a rendu une fois un livre en retard et a toujours rendu a temps tous les autres livres empruntés et ben elle va faire partie du resultat, et ce n'est pas ce qu'on veux...

j'ai tort?
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h07   #7
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par CinePhil Voir le message
TOUJOURS signifie que le nombre de retards de la personne est égal au nombre d'emprunts de cette personne.

Tourne-toi du côté de COUNT et de GROUP BY...
oui mais pour pouvoir faire cette requete, il faudrait connaitre a l'avance le nom de toutes les personnes de la base non? (pour pouvoir les compter)
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h17   #8
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par punkoff Voir le message
le contraire de "toujours" n'est-il pas "jamais" ? Bref prenez-le comme vous le voulez, mais les 3 solutions mentionnées fonctionnent.
euh oui...c'est ce que je pensais aussi mais notre prof n'a pas arrété de nous dire que le contraire de tjrs ce n'est pas jamais, pas en sql en tout cas (elle nous a toutefois pas donné la réponse)

quand vous dites les 3 solutions? desquels vous parlez? celles des précédents posts?

vous pourriez m'en dire plus s'il vous plait? merci
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h24   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par siho90 Voir le message
oui mais pour pouvoir faire cette requete, il faudrait connaitre a l'avance le nom de toutes les personnes de la base non? (pour pouvoir les compter)
Il ne s'agit pas de compter les personnes mais les emprunts par personne. Seulement celles qui ont emprunté ; celles qui n'ont pas emprunté n'ont pas non plus rendu en retard donc on s'en fout !

Je te mets sur la voie...
Combien d'emprunts par personne ?
Code :
1
2
3
SELECT Personne, COUNT(*) AS nb_emprunts
FROM Emprunt
GROUP BY Personne
Je te laisse faire la même chose pour compter les retards par personne, joindre les deux et ne garder que les personnes dont les deux nombres sont égaux.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h24   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
euh oui...c'est ce que je pensais aussi mais notre prof n'a pas arrété de nous dire que le contraire de tjrs ce n'est pas jamais, pas en sql en tout cas (elle nous a toutefois pas donné la réponse)

quand vous dites les 3 solutions? desquels vous parlez? celles des précédents posts?

vous pourriez m'en dire plus s'il vous plait? merci
Je me suis rendu compte de mon erreur, du coup ce que j'ai posté est faux.

Il faut donc prendre le truc a l'envers, enlever de l'ensemble des gens qui ont rendu un livre en retard ceux qui ont au moins une fois redu un livre en temps et en heure.


C'est ce qu'a posté tatayo.


La réponse Cinéphil marchera aussi.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h39   #11
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par CinePhil Voir le message
Il ne s'agit pas de compter les personnes mais les emprunts par personne. Seulement celles qui ont emprunté ; celles qui n'ont pas emprunté n'ont pas non plus rendu en retard donc on s'en fout !

Je te mets sur la voie...
Combien d'emprunts par personne ?
Code :
1
2
3
SELECT Personne, COUNT(*) AS nb_emprunts
FROM Emprunt
GROUP BY Personne
Je te laisse faire la même chose pour compter les retards par personne, joindre les deux et ne garder que les personnes dont les deux nombres sont égaux.
Merci beaucoup, je viens de tester votre solution et j'ai ecris ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT *  FROM
(SELECT Personne, COUNT(*) AS nb_emprunts
FROM Emprunt
GROUP BY Personne) A
INNER JOIN
 
(SELECT Personne, COUNT(*) AS nb_emprunts2
FROM retard
GROUP BY Personne) B
ON A.nb_emprunts=B.nb_emprunts2;
mais je crois qu'il y a une erreur dans ma requete car le compte n'est pas bon pour la table retard, c'est bizarre!!

je suis désolée de vous déranger encore mais vous pourriez me dire ce qui cloche?

merci infiniment
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h45   #12
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Je pense qu'il te manque une jointure dans ta requête...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h46   #13
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Citation:
Envoyé par tatayo Voir le message
Je pense qu'il te manque une jointure dans ta requête...

Tatayo.
ah oui..?? euh... une jointure sous quelle condition? désolée je ne vois pas
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h51   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
J'avais écrit ceci :
Citation:
Je te laisse faire la même chose pour compter les retards par personne, joindre les deux et ne garder que les personnes dont les deux nombres sont égaux.
"ne garder que", c'est une restriction qui s'exprime en SQL par un WHERE.

Dans ta requête, tu fais la jointure sur le nombre d'emprunts = le nombre de retours.

Si Jean à 5 emprunts et Jules 5 retours, les deux lignes seront jointes !

La condition de jointure est à faire sur les personnes et la restriction sur l'égalité des comptes :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT A.Personne  
FROM
(
    SELECT Personne, COUNT(*) AS nb_emprunts
    FROM Emprunt
    GROUP BY Personne
) A
INNER JOIN 
(
    SELECT Personne, COUNT(*) AS nb_emprunts2
    FROM retard
    GROUP BY Personne
) B ON A.Personne = B.Personne
WHERE A.nb_emprunts = B.nb_emprunts2
Au passage, évite la guerre des étoiles !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 18h01   #15
Invité de passage
 
Inscription : avril 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 21
Points : 3
Points : 3
Ah oui zut c'est vrai...

ouf ça marche

génial

merci infiniment à tous (CinePhil, punkoff et tatayo)

CinePhil merci encore pour votre idée ça m'enlève vraiment une épine du pied
(dac o dac pr la "guerre des étoiles"^^ je ferais attention)

bonne soirée
siho90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h13.


 
 
 
 
Partenaires

Hébergement Web