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 :

Demande de renseignements sur "Having" et "Connect By Prior"


Sujet :

Langage SQL

  1. #1
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut Demande de renseignements sur "Having" et "Connect By Prior"
    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

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    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

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    merci!
    rete plus que le having

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    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)

    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
    La requête ci-dessus remonte la moyenne de chaque élève.

    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 :
    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
    Est-ce plus clair ?

  5. #5
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    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 écrit

    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 trouve ma syntaxe plus rapide à écrire et au moins aussi simple
    je ne sais rien au niveau des perfs par contre

  6. #6
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    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" ?

  7. #7
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 286
    Points
    3 286
    Par défaut
    Citation Envoyé par luta
    pas vraiment car j aurais écrit

    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 trouve ma syntaxe plus rapide à écrire et au moins aussi simple
    je ne sais rien au niveau des perfs par contre
    Ce n'est ni un problème de rapidité ou de simplicité ou de performance mais un problème de norme SQL.
    La façon dont vous écrivez la requête ne marche tout simplement pas en SQL.

Discussions similaires

  1. Demande de renseignement sur Visual Studio.NET
    Par loic20h28 dans le forum Windows
    Réponses: 3
    Dernier message: 30/11/2007, 20h03
  2. Demande de renseignements sur Interface
    Par MoscoBlade dans le forum C#
    Réponses: 7
    Dernier message: 21/02/2007, 16h38
  3. Réponses: 2
    Dernier message: 04/06/2006, 22h35
  4. demande de renseignements sur les classes
    Par altadeos dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2006, 16h59
  5. demande de renseignement sur delfi 7
    Par cybob dans le forum Débuter
    Réponses: 11
    Dernier message: 19/02/2006, 19h32

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