-- Pour avoir le nombre d'enregistrement.
SELECT COUNT(*)
FROM
CptMouvement,
CptTransaction
WHERE
CptMouvement.COMPTE_ROBID = 6180
AND CptTransaction.robId = CptMouvement.TRANSACTIONFIN_ROBID
AND CptTransaction.dateCreation < ( SYSDATE + 1 )
AND CptTransaction.dateCreation > ADD_MONTHS( SYSDATE + 1, -1 );
-- Pour avoir la troisième page de 10 enregistrements.
SELECT
*
FROM (
SELECT
ROWNUM x, a, b, c
FROM (
SELECT
CptTransaction.dateCreation a,
CptMouvement.Robid b,
CptMouvement.montant c
FROM
CptMouvement,
CptTransaction
WHERE
CptMouvement.COMPTE_ROBID = 6180
AND CptTransaction.robId = CptMouvement.TRANSACTIONFIN_ROBID
AND CptTransaction.dateCreation < ( SYSDATE + 1 )
AND CptTransaction.dateCreation > ADD_MONTHS( SYSDATE + 1, -1 )
ORDER BY
CptTransaction.dateCreation DESC
)
)
WHERE
x >= 21
AND x <= 30;
-----------------------------------------------------------------------------------------
Bonjour les gens
J'ai un peu cherché, et à force de ne pas trouver, j'ai inventé...
Quoi ? Ben un affichage par page pour les requêtes sous ORACLE.
Pour avoir 10 enregistrements à partir du 11ème, en MySql, c'est simple :
Code :
- SELECT * FROM MaTable WHERE Blabla... ORDER BY... LIMIT 10 rows 10
|
Avec Oracle, çà l'est Beaucoup MOINS !
Y'a bien une notion de ROWNUM, mais elle n'est pas très pratique à utiliser :
1- Le ROWNUM n'est généré que pour les enregistrements réellement retourné. Le premier est donc toujours 1.
Si on fait un WHERE ROWNUM > 10 par exemple, la requête ne retourne rien. En revanche, on peut mettre une limite supérieure.
2- Le ROWNUM est généré AVANT le ORDER BY, ce qui fait que dans les cas d'un affichage par page, on a un problème :
exemple :
SELECT ROWNUM, MONTANT, DATE FROM VENTES ORDER BY MONTANT DESC;
Code :
- ROWNUM MONTANT DATE
- 7 200 2002/12/21
- 5 190 2002/12/10
- 3 175 2002/12/05
- 1 120 2002/12/03
- 2 75 2002/12/05
- 9 75 2002/12/28
- 6 50 2002/12/19
- 4 15 2002/12/07
- 8 10 2002/12/24
|
Si je limite ROWNUM à 5, (la première page) je voudrais avoir çà :
Code :
- 1 200 2002/12/21
- 2 190 2002/12/10
- 3 175 2002/12/05
- 4 120 2002/12/03
- 5 75 2002/12/05
|
Mais en fait j'aurais çà :
Code :
- 5 190 2002/12/10
- 3 175 2002/12/05
- 1 120 2002/12/03
- 2 75 2002/12/05
- 4 15 2002/12/07
|
Il faut donc trouver une solution pour les deux problèmes.
J'ai pas trouvé mieux que ce qui suit pour avoir, par exemple, la deuxième page ( par page de 10 ):
Code :
- SELECT
- *
- FROM (
- SELECT
- ROWNUM x, MONTANT, DATE
- FROM (
- SELECT
- MONTANT,
- DATE
- FROM
- VENTES
- WHERE
- CAT=1
- ORDER BY MONTANT DESC
- )
- )
- WHERE
- x >= 21
- AND x <= 30;
|
Ce qui fait quand même 3 requêtes imbriquées au minimum !
Ce que j'aimerai savoir, c'est si je me suis cassé la tête pour rien, ou si y'a pas de meilleur solution...
Message édité par Mara's dad le 04-02-2003 à 17:46:10
---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.