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 :

Requête paginée avec ROWID


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Requête paginée avec ROWID
    Bonjour,

    Je souhaite mettre en place un système de requête paginée pour autoriser des temps de réponse correct avec des tables volumineuses.

    J'utilise habituellement la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * from ( select subreq.*, rownum r from ( SELECT t.* FROM EMP t ) subreq 
    where rownum <= 10) where r >=  5
    Cependant, l'ajout du ROWID dans les colonnes de la reqête génère une infâme erreur ORA-01446:cannot select ROWID from view with DISTINCT, GROUP BY, etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * from ( select subreq.*, rownum r from ( SELECT t.ROWID, t.* FROM EMP t ) subreq 
    where rownum <= 10) where r >=  5
    Quelqu'un connait-il une solution de contournement ?
    D'avance merci,

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Il manque l'ORDER BY dans ta requête exemple .
    Apparement c'est à cause de rownum, avec row_number ça marche :
    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
    SQL> SELECT *
      2    FROM ( SELECT subreq.*
      3             FROM ( SELECT t.ROWID, t.*,
      4                           row_number() over (order by empno) as rn
      5                      FROM EMP t ) subreq
      6            WHERE rn <= 10)
      7   WHERE rn >=  5;
     
    ROWID                   EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO         RN
    ------------------ ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ----------
    AAAF8jAABAAALJJAAE       7654 MARTIN     SALESMAN        7698 28/09/81       1250       1400         30          5
    AAAF8jAABAAALJJAAF       7698 BLAKE      MANAGER         7839 01/05/81       2850                    30          6
    AAAF8jAABAAALJJAAG       7782 CLARK      MANAGER         7839 09/06/81       2450                    10          7
    AAAF8jAABAAALJJAAH       7788 SCOTT      ANALYST         7566 09/12/82       3000                    20          8
    AAAF8jAABAAALJJAAI       7839 KING       PRESIDENT            17/11/81       5000                    10          9
    AAAF8jAABAAALJJAAJ       7844 TURNER     SALESMAN        7698 08/09/81       1500          0         30         10
     
    6 rows selected.
     
    SQL>
    Mais bon dans le plan on perd le STOP KEY... Donc pas sûr que ce soit optimal.
    Mais comme on ne sait pas l'objectif le contournement est peut être suffisant.

  3. #3
    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
    Citation Envoyé par skuatamad Voir le message
    Il manque l'ORDER BY dans ta requête exemple .
    Apparement c'est à cause de rownum, avec row_number ça marche :
    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
    SQL> SELECT *
      2    FROM ( SELECT subreq.*
      3             FROM ( SELECT t.ROWID, t.*,
      4                           row_number() over (order by empno) as rn
      5                      FROM EMP t ) subreq
      6            WHERE rn <= 10)
      7   WHERE rn >=  5;
     
    ROWID                   EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO         RN
    ------------------ ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ----------
    AAAF8jAABAAALJJAAE       7654 MARTIN     SALESMAN        7698 28/09/81       1250       1400         30          5
    AAAF8jAABAAALJJAAF       7698 BLAKE      MANAGER         7839 01/05/81       2850                    30          6
    AAAF8jAABAAALJJAAG       7782 CLARK      MANAGER         7839 09/06/81       2450                    10          7
    AAAF8jAABAAALJJAAH       7788 SCOTT      ANALYST         7566 09/12/82       3000                    20          8
    AAAF8jAABAAALJJAAI       7839 KING       PRESIDENT            17/11/81       5000                    10          9
    AAAF8jAABAAALJJAAJ       7844 TURNER     SALESMAN        7698 08/09/81       1500          0         30         10
     
    6 rows selected.
     
    SQL>
    Mais bon dans le plan on perd le STOP KEY... Donc pas sûr que ce soit optimal.
    Mais comme on ne sait pas l'objectif le contournement est peut être suffisant.
    Merci, seulement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row_number() over (ORDER BY empno) AS rn
    ici ORDERBY empno est "en dur" alors que ce système est sensé s'adapter à un nom de table donné dynamiquement.
    Le but est d'afficher dans un bloc dynamique (un JTable Java) les données de n'importe quelle table.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Il suffit d'aliaser rowid

    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
    SQL> SELECT * FROM 
      2    ( SELECT subreq.*, ROWNUM r 
      3       FROM ( SELECT t.ROWID , t.* FROM dual t ORDER BY 1) subreq 
      4     WHERE ROWNUM <= 10   
      5        ) 
      6  WHERE r >=  5;
    SELECT * FROM
           *
    ERROR at line 1:
    ORA-01446: cannot select ROWID from view with DISTINCT, GROUP BY, etc.
     
     
    SQL> SELECT * FROM 
      2    ( SELECT subreq.*, ROWNUM r 
      3       FROM ( SELECT t.ROWID idrow, t.* FROM dual t ORDER BY 1) subreq 
      4     WHERE ROWNUM <= 10   
      5        ) 
      6  WHERE r >=  5;
     
    no rows selected
     
    SQL>

  5. #5
    Expert confirmé 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
    Par défaut
    ORDER BY rowid

    [Edit]
    Attention, n’importe quelle solution pose le problème de tri
    [/Edit]

  6. #6
    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
    Toutefois, ceci semble fonctionner dans tous les cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row_number() over (ORDER BY 1) AS rn

  7. #7
    Expert confirmé 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
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Toutefois, ceci semble fonctionner dans tous les cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row_number() over (ORDER BY 1) AS rn
    Ce n’est pas sérieux !
    Utilise Order by rowid.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    J'ai un problème avec le concept, si l'ordre n'a pas d'importance, pourquoi ne pas faire simplement un WHERE ROWNUM <= 5 ?

  9. #9
    Expert confirmé 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
    Par défaut
    Pareil j’ai un problème avec le concept requête paginée sans tri

    @Waldar
    Rownum between N and N+5

  10. #10
    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,

    Citation Envoyé par SheikYerbouti Voir le message
    Toutefois, ceci semble fonctionner dans tous les cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row_number() over (ORDER BY 1) AS rn
    attention ici 1 ne fait pas référence à la première colonne (comme dans le order by d'un select) mais est simplement la constante 1 ... donc il n'y a pas de tri.

    Mais j'ai du mal à imaginer l’intérêt de faire de la pagination sans avoir un ordre de tri. L'utilisateur fait quoi quand on lui afficher les 5 premiers sans lui dire dans quel ordre ? Sauf s'il en veut juste 5 au hasard.

    Cordialement,
    Franck.

  11. #11
    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 sous requête contient éventuellement une clause ORDER BY

    Merci à tous

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Quelqu'un connait-il une solution de contournement ?
    Avec les pseudo-colonnes, si on veut les remonter il faut les aliaser, sinon au niveau du dessus Oracle s'y perd.

Discussions similaires

  1. Pagination avec table jointe et sous-requête
    Par dovmeup dans le forum Requêtes
    Réponses: 11
    Dernier message: 30/05/2014, 09h11
  2. pagination avec des requêtes sql sous access
    Par zalalus dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/11/2007, 23h14
  3. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33
  4. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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