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

Oracle Discussion :

Requète ne retournant que l'élément le plus récent


Sujet :

Oracle

  1. #1
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut Requète ne retournant que l'élément le plus récent
    Bonjour,

    Je ne suis pas un spécialiste des requêtes SQL et encore moins d'Oracle...

    J'ai une table contenant un certain nombre de données dont une date et un texte... J'aimerai savoir si il existe une fonction ou un mot clé SQL me permettant de ne retourner que l'enregistrement le plus récent (//date) sans avoir besoin de créer une requète imbriquée...

    Merci d'avance


    Romulus

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    La fonction MAX() appliquée à une date vous donnera la date la plus récente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from emp 
    where hiredate  = (select max(hiredate) from emp )

  3. #3
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from matable where ROWNUM=1 ORDER BY MADATE DESC
    Comme il me semble que rownum intervient APRES le tri ...

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par nuke_y
    Comme il me semble que rownum intervient APRES le tri ...
    Non justement... Si tu veux utiliser rownum il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from (select * from matable ORDER BY MADATE DESC)
    where ROWNUM=1
    Mais la solution de Sheik me semble plus appropriée.

  5. #5
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    Merci


    Je vais essayer ces solutions et vous en donnerais le résultat Lundi..


    Bon Week-End !


    Romulus

  6. #6
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Ah oui, mais alors effectivement tant qu'à faire des requêtes imbriquées autant utiliser la solution de sheik.

    EDIT :
    Rien du tout j'ai raison et ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select DAY from MonCalendrier where rownum=1 ORDER BY DAY DESC
    donne le jour le plus récent et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select DAY from MonCalendrier where rownum=1 ORDER BY DAY ASC
    donne le jour le plus ancien.

  7. #7
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    Merci Sheik et Nuke, ça fonctionne au poil pour les 2 solutions !!

    Super Cools ! 8)


    Romulus

  8. #8
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Cependant le solution de sheik est plus "propre" donc préférable (et même en terme de perfs je pense que c'est mieux).

  9. #9
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Nuke_y, fais le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> create table test (a number);
    Table created.
     
    SQL> insert into test values (5);
    1 row created.
     
    SQL> insert into test values (1);
    1 row created.
     
    SQL> insert into test values (9);
    1 row created.
    La requête suivante devrait te ramener 9 et non 5 et pourtant ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select a from test where rownum = 1 order by a desc;
            A
    ---------
            5
    J'en suis d'autant plus sûr que c'est une question qui revient souvent sur le forum.

  10. #10
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Et oui !
    Il ne faut pas partir du principe que les données sont entrées déjà triées dans la table !

  11. #11
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Sauf que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select a from test where rownum = 1 order by a asc; 
            A 
    --------- 
            5
    Me renvoit la même chose !! Ce qui est logique : il trie de façon croissante la 1ere ligne de la table alors que dans le test précédent il triait de façon décroissante la 1ere ligne de la table. Mais dans les 2 cas il s'agit de la 1ere ligne !! Donc du même résultat.

    Alors pourquoi dans mon exemple est-ce que ça a donné 2 résultats différents ? Et les bons en plus. Je reteste et je vous tient au courant.

    Non mais c'est de la folie !!! Ca marche bien sur ma table CALENDAR (remarque j'avais testé) !!! C'est quoi ce truc de fou ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> SELECT DAY from DWH.CALENDAR WHERE ROWNUM=1 ORDER BY DAY DESC;
     
    DAY
    --------
    31/12/05
     
    SQL> SELECT DAY from DWH.CALENDAR WHERE ROWNUM=1 ORDER BY DAY ASC;
     
    DAY
    --------
    01/01/99

  12. #12
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Au risque de devoir répéter, le ROWNUM est attribué avant la clause ORDER BY

  13. #13
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    j'ai bien compris, j'ai bien compris. Mais comment expliquer le résultat au dessus ??? normalement il devrait ne me retourner que la 1ere ligne de la base ! Or là selon ASC ou DESC il me retourne la 1ere dans le temps ou la dernière dans le temps !!

    Et pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SQL> SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5 ORDER BY DAY DESC;
     
    DAY
    --------
    31/12/05
    30/12/05
    29/12/05
    28/12/05
     
    SQL> SELECT DAY from (SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5 ORDER BY DAY DESC) WHERE ROWNUM=1 ORDER BY DAY ASC;
     
    DAY
    --------
    31/12/05
     
    SQL> SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5 ORDER BY DAY ASC;
     
    DAY
    --------
    01/01/99
    02/01/99
    03/01/99
    04/01/99
     
    SQL> SELECT DAY from (SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5 ORDER BY DAY ASC) WHERE ROWNUM=1 ORDER BY DAY DESC;
     
    DAY
    --------
    01/01/99
    Là on voit bien que le rownum de plus haut niveau ne travaille que sur la 1ere du jeu de données... Je ne comprend pas, comment est-ce possible ? Est-ce que je suis très fatigué ? Dans ce cas expliquez moi avec des mots simples...

  14. #14
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok. faites le test suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create table test_rownum ( num number(2), ddate date )
     
    insert into test_rownum values (1, sysdate-2)
     
    insert into test_rownum values (2, sysdate-1)
     
    insert into test_rownum values (3, sysdate-3)
     
    insert into test_rownum values (4, sysdate)
     
    select * from test_rownum
     
    select * from test_rownum where rownum <= 1 order by ddate desc

  15. #15
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    ça marche comme il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SQL> select * from test_rownum
      2  ;
     
           NUM DDATE
    ---------- --------
             1 06/07/05
             2 07/07/05
             3 05/07/05
             4 08/07/05
     
    SQL> select * from test_rownum where rownum <= 1 order by ddate desc;
     
           NUM DDATE
    ---------- --------
             1 06/07/05
     
    SQL> select * from test_rownum where rownum <= 1 order by ddate ASC;
     
           NUM DDATE
    ---------- --------
             1 06/07/05
    mais ça n'explique pas pourquoi sur ma table DWH.CALENDAR ça me sort des résultats différents en ASC ou en DESC !?!

  16. #16
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Vraiment dingue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SQL> SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5;
     
    DAY
    --------
    01/01/99
    11/04/00
    12/04/00
    13/04/00
     
    SQL> SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5 ORDER BY DAY ASC;
     
    DAY
    --------
    01/01/99
    02/01/99
    03/01/99
    04/01/99
     
    SQL> SELECT DAY from ODS_DRH.JOUR WHERE ROWNUM<5 ORDER BY DAY DESC;
     
    DAY
    --------
    31/12/05
    30/12/05
    29/12/05
    28/12/05
    Est-ce qu'un index peut faire que l'optimizer d'Oracle provoque ça ?

  17. #17
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Cela dépend de l'existance d'un index sur la colonne.

  18. #18
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Il n'y a qu'une primary key sur cette colonne et donc un Index UNIQUE...

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

Discussions similaires

  1. [MySQL] Requête qui ne retourne que la première ligne
    Par CYRIAQU3 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/10/2014, 16h37
  2. Réponses: 3
    Dernier message: 04/07/2012, 13h33
  3. Réponses: 4
    Dernier message: 01/03/2011, 12h15
  4. [AC-2007] L'ajout d'une table, et ma requête ne retourne plus rien
    Par Grooz13 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/08/2010, 06h29
  5. Réponses: 2
    Dernier message: 14/06/2009, 17h01

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