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 :

Filtrage du n au m enregistrements de la FAQ


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de _Agrid
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 112
    Par défaut Filtrage du n au m enregistrements de la FAQ
    Bonjour

    Une petite question sur l article de la FAQ concernant le filtrage de n tuples dans un intervalle d'une requete

    dans la FAQ est mentionnée la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * 
      FROM (SELECT ROWNUM NUM, ename, job 
              FROM EMP ORDER BY sal
           ) 
     WHERE NUM BETWEEN 6 AND 10 ;
    que je vais modifier comme suis pour vous expliquer mon interrogation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ROWNUM NUM1, SR.* 
      FROM (SELECT ROWNUM NUM, ename, job 
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM BETWEEN 6 AND 10 ;
    Si je comprends bien, l'objectif etait d'avoir le nom et le job des personnes avec salaires les plus petits entre le rang 6 et le rang 10

    Or le filtrage est effectué sur NUM dans la sous requete et a l'intérieur des parentheses l attribution du rownum se fait avant le tri (cf. Comment filtrer les n premières lignes d'une requête avec ROWNUM ? de la FAQ)

    j'ai bien essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ROWNUM NUM1, SR.* 
      FROM (SELECT ROWNUM NUM, ename, job 
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM1 BETWEEN 6 AND 10 ;
    mais une erreur "invalid identifier" apparait

    pourriez vous eclairer ma lanterne ?

    merci

    Cdlt

    _Agrid

  2. #2
    Expert confirmé
    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 : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Effectivement rownum est évalué après l'oder by, donc il faut mettre l'order by dans une sous-requête:

    SELECT *
    FROM (SELECT ROWNUM NUM, ename, job
    FROM (select * from EMP ORDER BY sal)
    )
    WHERE NUM BETWEEN 6 AND 10 ;
    Cordialement,
    Franck.

  3. #3
    Membre confirmé Avatar de _Agrid
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 112
    Par défaut Maj FAQ ?
    Bonjour

    Merci de ta réponse

    Ne serait il pas interressant de faire une petite maj de la FAQ ?

    En fait c'est la version OffLine qui semble ne pas etre à jour

    Merci

    _Agrid

  4. #4
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Citation Envoyé par _Agrid Voir le message
    Bonjour

    Merci de ta réponse

    Ne serait il pas interressant de faire une petite maj de la FAQ ?

    En fait c'est la version OffLine qui semble ne pas etre à jour

    Merci

    _Agrid
    Bonjour,

    je ne sais pas ce que tu essaies de faire

    mais

    si tu veux avoir le nieme

    c'est bien
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SR.*
      FROM (SELECT ROWNUM NUM, ename, job
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM BETWEEN 6 AND 10 
    /
    ]

    ou

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
      FROM (SELECT ROWNUM NUM, ename, job
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM BETWEEN 6 AND 10 
    /
    ]

    mais

    pas

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT ROWNUM NUM1, SR.* 
      FROM (SELECT ROWNUM NUM, ename, job 
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM BETWEEN 6 AND 10 ;

    Parce que tu ne peux pas mettre dans un WHERE un alias ,c'est tout rien
    a voir avec la DOC ....



    par contre tu peux
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT ROWNUM NUM, SR.* 
      FROM (SELECT ROWNUM NUM, ename, job 
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM BETWEEN 6 AND 10 ;

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par fatsora Voir le message
    ...
    c'est bien
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
      FROM (SELECT ROWNUM NUM, ename, job
              FROM EMP ORDER BY sal
           ) SR
     WHERE NUM BETWEEN 6 AND 10 
    /
    Justement non, ça ne fournit pas le bon résultat !
    Comme cela a été rappelé, le ROWNUM est attribué avant le tri. Donc cette requête ramène simplement les lignes 6 à 10 de la table de départ, sans aucun tri effectif.

    C'est pour ça qu'il faut soit utiliser la requête fournie par Pachot, qui se base non pas sur le ROWNUM de la requête interne, mais sur le ROWNUM de la requête de deuxième niveau, après le tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM (SELECT ROWNUM NUM, ename, job
    FROM (select * from EMP ORDER BY sal)
    )
    WHERE NUM BETWEEN 6 AND 10 ;
    Soit utiliser la solution avec OVER fournie dans la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ename, job
      FROM (SELECT ename, job, ROW_NUMBER() OVER (ORDER BY sal) num
              FROM emp 
           ) 
     WHERE num BETWEEN 6 AND 10;

  6. #6
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Justement non, ça ne fournit pas le bon résultat !
    Comme cela a été rappelé, le ROWNUM est attribué avant le tri. Donc cette requête ramène simplement les lignes 6 à 10 de la table de départ, sans aucun tri effectif.

    C'est pour ça qu'il faut soit utiliser la requête fournie par Pachot, qui se base non pas sur le ROWNUM de la requête interne, mais sur le ROWNUM de la requête de deuxième niveau, après le tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM (SELECT ROWNUM NUM, ename, job
    FROM (select * from EMP ORDER BY sal)
    )
    WHERE NUM BETWEEN 6 AND 10 ;
    Soit utiliser la solution avec OVER fournie dans la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ename, job
      FROM (SELECT ename, job, ROW_NUMBER() OVER (ORDER BY sal) num
              FROM emp 
           ) 
     WHERE num BETWEEN 6 AND 10;

    OK Rien ne vaut la demo,
    tu as raison et notre ami Agrid aussi, sauf la petite partie where sur alias , mais bon ...

    J'etais sur un raisonement <rownum et non between

    La doc est donc a mettre a jour ....

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

Discussions similaires

  1. Filtrage des enregistrements en delphi 7
    Par laguesbo dans le forum Débuter
    Réponses: 13
    Dernier message: 12/08/2011, 10h32
  2. requete SQL avec filtrage sur les derniers enregistrements
    Par yaumme dans le forum Langage SQL
    Réponses: 14
    Dernier message: 25/03/2009, 00h11
  3. tcxgrid avec filtrage nbr enregistrements
    Par moulery dans le forum Composants VCL
    Réponses: 1
    Dernier message: 27/02/2009, 17h36
  4. Filtrage des enregistrements sur la derniere date
    Par Franck_P dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/12/2008, 11h15
  5. Réponses: 5
    Dernier message: 05/02/2008, 06h48

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