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

SQL Oracle Discussion :

Requete SQL complexe


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2007
    Messages : 46
    Points : 43
    Points
    43
    Par défaut Requete SQL complexe
    salut à tous,
    Voila, j'ai un costeau problème quant à la selection de certaines données dans ma BD.
    Voici la structure de mes tables :
    NOTE (id_note, matricule_eleve, note, date_note)
    ELEVE (matricule, nom, classe)


    Comme vous voyez, un elève peut avoir plusieurs note mais à des dates différentes.
    Il me faut donc écrire une requête qui va sélectionner le matricule, le nom de l'élève, la note la plus récente et la date de cette note, de tous les élèves.

    EN fait je me suis cassé la tête dessus deja que je me demande s'il y'a pas un autre moyen d'y parvenir autre qu'une requete SQL.

    Quelqu'un aurait une idée ?

    Merci d'avance à tous.

  2. #2
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Si j'ai bien compris la question, ceci devrait faire ton affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT matricule_eleve, date_note, note
    FROM note n1
    WHERE date_note = (
    SELECT MAX(date_note) 
    FROM note n2
    WHERE n1.matricule_eleve = n2.matricule_eleve
    )

  3. #3
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    en utilisant les fonctions analytiques, ce sera plus performant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select matricule_eleve, date_note, note from (
      select matricule_eleve, date_note, note,max(date_note)over(partition by matricule_eleve) max_date_note
      from note 
    ) where date_note=max_date_note
    Cordialement,
    Franck.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Sans sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      select ev.matricule, ev.nom,
             max(nt.note) keep (dense_rank last order by nt.date_note asc) as note_date_max,
             max(nt.date_note) as date_note_max
        from eleve ev
             inner join note nt
               on nt.matricule_eleve = ev.matricule
    group by ev.matricule, ev.nom;
    Attention néanmoins, si vous avez deux notes à la même date, cette requête ne vous ramènera que la plus grande des deux.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Waldar Voir le message
    ...
    Attention néanmoins, si vous avez deux notes à la même date, cette requête ne vous ramènera que la plus grande des deux.
    Pour bien appuyer la remarque de Waldar :

    Chaque fois quand vous est confronté avec une requête de type top N (la plus récente, etc.) commencez d’abord par répondre à la question quelle est le résultat attendu quand plusieurs enregistrements correspondent aux critères et seulement après commencez à écrire la requête

  6. #6
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2007
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Merci à tous pour ces réponses.

    j'ai pu tester les requetes :
    @rvfranck, j'ai un peu adapté la tienne il n'y avait pas le champ nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT n1.matricule_eleve, n1.date_note, n1.note, e.nom
    FROM note n1, eleve e
    WHERE date_note = (
    SELECT MAX(date_note) 
    FROM note n2
    WHERE n1.matricule_eleve = n2.matricule_eleve
    ) and e.matricule = n1.matricule_eleve
    Ca a marché. mais avec les SELECT qui s'imbriquent, je me demande si le temps d'exécution sera pas long !!!

    @pachot, elle marche parfaitement. Mais j'ai essayé de rajouter le champ nom de la table élève et ca me complique vraiment la tâche. Mais merci déjà pour cette requete. Le reste sera plus simple.

    @waldar, mnitu : vous avez raison. C'est exactement ce qui se passe. Mais en supposant que les date sont sous format date-heure, je crois pas que ca va géner.
    A part cela toutes les requetes sont super correctes Et fonctionnent. Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete sql complexe
    Par susimido dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/04/2007, 17h01
  2. requete SQL complexe!
    Par cedlannoy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2007, 20h45
  3. requete sql complexe, que faire: 2 sql imbriques ou fonction date?
    Par Aliveli dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/06/2006, 20h20
  4. Requete SQL complexe
    Par isa21493 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/02/2006, 16h43
  5. Requete sql complexe
    Par ekinoxe dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/01/2006, 16h16

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