Bonjour quelqu'un pourrait il m expliquer une bonne fois pour toute (parce j ai essayé et encore et encore)
les clauses:
- Having
- Connect by prior
Merci
Bonjour quelqu'un pourrait il m expliquer une bonne fois pour toute (parce j ai essayé et encore et encore)
les clauses:
- Having
- Connect by prior
Merci
Mediat avait deja developpé un peu l'utilisation du Connect by prior
http://www.developpez.net/forums/showthread.php?t=79346
Cela permet de creer des requete hierarchique, particulierement utile pour des structures en arbres.
il s'utilise : SELECT [LEVEL],<col> FROM table
[WHERE conditions]
START WITH conditions
CONNECT BY PRIOR conditions;
LEVEL permettra de savoir combien de niveau ont été parcouru
HAVING permet d'avoir une restriction au niveau d'un groupe (contrairement a WHERE qui permet d'avoir une restriction au niveau d'une ligne).
J'espere que ca peut t'aider
Bon courage
Illustration par l'exemple :
Soient deux tables Eleve et note. La table élève contient l'identifiant de l'élève et son nom. La table note contient l'identifiant de la note, l'identifiant de l'élève correspondant à cette note, et la valeur de la note notée sur 20.
eleve(id_eleve,nom_eleve)
note(id_note,id_eleve,valeur)
La requête ci-dessus remonte la moyenne de chaque élève.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT eleve.nom_eleve, avg(note.valeur) FROM eleve INNER JOIN note on note.id_eleve=eleve.id_eleve GROUP BY eleve.nom
Désormais, je veux limiter ma recherche aux élèves qui ont la moyenne générale, c'est à dire les élèves qui ont une moyenne supérieure ou égale à 10 :
Est-ce plus clair ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT eleve.nom_eleve, avg(note.valeur) FROM eleve INNER JOIN note on note.id_eleve=eleve.id_eleve GROUP BY eleve.nom HAVING avg(note.valeur) >= 10
pas vraiment car j aurais écritSELECT eleve.nom_eleve, avg(note.valeur) FROM eleve
INNER JOIN note on note.id_eleve=eleve.id_eleve
GROUP BY eleve.nom
HAVING avg(note.valeur) >= 10
je trouve ma syntaxe plus rapide à écrire et au moins aussi simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT eleve.nom_eleve, avg(note.valeur) FROM eleve, note WHERE note.id_eleve=eleve.id_eleve AND avg(note.valeur) >= 10 GROUP BY eleve.nom
je ne sais rien au niveau des perfs par contre
Essaie ta requête, elle ne marche pas.
Dans le prédicat (i.e. dans ta clause where), tu ne peux pas mettre de test sur le résultat d'une fonction d'agrégation. Tu dois le mettre dans la partie "HAVING".
Tiens question subsidiaire ... Quelqu'un sait comment s'appelle cette fameuse "partie HAVING" ?
Ce n'est ni un problème de rapidité ou de simplicité ou de performance mais un problème de norme SQL.Envoyé par luta
La façon dont vous écrivez la requête ne marche tout simplement pas en SQL.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager