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 :

[Oracle] fonction "Limit"


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Corée

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2008
    Messages : 253
    Points : 122
    Points
    122
    Par défaut [Oracle] fonction "Limit"
    Bonjour

    J'essaie de faire l'équivalent de la fonction Limit de MySQL sous Oracle.

    Je travaille avec Oracle 10g, Hibernate 3.3

    D'après tout ce que j'ai vu, ma requête devrait passer mais ce n'est pas le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY null ASC)  row FROM Emission) WHERE row > 0 AND row <= 20
    Erreur :
    ORA-00923: mot-clé FROM absent à l'emplacement prévu

    Des idées ? Merci

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
      FROM (SELECT t.*, 
                   ROW_NUMBER() OVER (ORDER BY NULL ASC) As arow 
              FROM Emission t) 
    WHERE arow > 0 
      AND arow <= 20

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Un meilleur equivalent du limit, bien moins couteux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
    from
    (
    select rownum as rw, i.* from Emission i
    )
    where rw between 1 and 20

  4. #4
    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
    Oui, c’est vrai ; quand on regarde de près nul besoin d’une fonction analytique ni de tests de type r>0 ou r >=1.

  5. #5
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Voici un code plus optimisé pour les tables volumineuses:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from ( select subreq.*, rownum r from ( select * from EMP ) 
    subreq where rownum <= <num_fin> ) 
    where r >= <num_deb> ;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Bonjour SheikYerbouti,

    Je vois votre requete bien meilleure sur la recherche de valeurs proche du rownum = 0. Mais pourquoi ecrivez vous que ce code est optimisé pour les grandes tables ? Sur mes 5 minutes de tests la taille de la table n'a pas eu d'influence sur les requetes.

    Ma table identite a 125 000 enregistrements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * FROM
           (
           SELECT
           subreq.*, rownum r
           FROM
              (
              SELECT * FROM identite
              )
           subreq
           WHERE rownum <= 20
           )
    WHERE r >= 1 ;
    -> Tres performante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT * FROM
           (
           SELECT
           subreq.*, rownum r
           FROM
              (
              SELECT * FROM identite
              )
           subreq
           WHERE rownum <= 120000
           )
    WHERE r >= 119981 ;
    -> Classique

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Quelle est la probabilité que vous affichiez dans votre application les lignes 119981 à 120000 ?

    Si votre grille fait 20 lignes, ça fait 6000 next quand même !

  8. #8
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Je comparais à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM
    (
    SELECT rownum AS rw, i.* FROM Emission i
    )
    WHERE rw BETWEEN 1 AND 20
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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