2011-10-13 4 views
1

J'ai une requête dans Oracle pour récupérer des données de table en utilisant rownum mais je n'ai pas eu de données.
Ma requête est comme ceci:aller chercher des données en utilisant rownum dans oracle

select * from table-name where rownum<5

est c'est une mauvaise requête pour récupérer les données dont le numéro de ligne est inférieur à 5.
quand je recherche comme:
select * from table-name where rownum<=4
que ce sera donne un enregistrement de résultat.

Ma question est ce qui ne va pas ici?
Est-ce une erreur de syntaxe ou autre chose? ..

+1

Fonctionne bien ici en utilisant Oracle 10g, notez bien que vous n'aurez aucun contrôle sur les 4 lignes qui sont retournées .... – OTTA

+0

Attention: 'ROWNUM' n'est pas une pseudo-colonne pour votre table, c'est une pseudo-séquence pour un résultat ensemble. – Benoit

+0

utiliser l'ordre par pour assurer la cohérence – tbone

Répondre

5

rownum est une pseudo-colonne qui compte les lignes dans le jeu de résultats après l'application de la clause where. Toutefois, cette requête renvoie toujours zéro ligne, quel que soit le nombre de lignes dans la table. Pour expliquer ce comportement, nous devons comprendre comment Oracle traite ROWNUM. Lors de l'affectation de ROWNUM à une ligne, Oracle commence à 1 et incrémente seulement la valeur lorsqu'une ligne est sélectionnée; c'est-à-dire lorsque toutes les conditions de la clause WHERE sont remplies. Étant donné que notre condition exige que ROWNUM est supérieur à 2, aucune ligne ne sont sélectionnés et ROWNUM est jamais incrémentée au-delà 1.

http://blog.lishman.com/2008/03/rownum.html

another stackoverflow link

Edité

ce paragraphe que je trouve sur oracle site Web qui est beaucoup mieux

Conditions de test pour les valeurs ROWNUM plus t han un entier positif est toujours faux. Par exemple, cette requête ne renvoie aucune ligne:

SELECT * FROM employees 
    WHERE ROWNUM > 1; 

La première ligne récupérée est attribuée une ROWNUM de 1 et fait la fausse condition. La deuxième ligne à extraire est maintenant la première ligne et est également affectée d'un ROWNUM de 1 et rend la condition fausse. Toutes les lignes échouent par la suite à satisfaire la condition, donc aucune ligne n'est retournée.

Vous pouvez également utiliser ROWNUM pour affecter des valeurs propres à chaque ligne d'une table, comme dans cet exemple:

+2

Bien correct, cela ne semble pas répondre à la question, qui est sur ROWNUM <5, pas ROWNUM> 5. –

4

La syntaxe me semble correcte.

Cependant ROWNUM est calculé sur les lignes de résultat par exemple:

SELECT * FROM TABLE_NAME WHERE ROWNUM < 10 ORDER BY TABLE_FIELD ASC; 

et

SELECT * FROM TABLE_NAME WHERE ROWNUM < 10 ORDER BY TABLE_FIELD DESC; 

vous donnera des résultats différents.

Chaque fois qu'une requête est exécutée, pour chaque ligne, Oracle affecte un ROWNUM qui est scopet à cette seule requête.

Qu'essayez-vous d'accomplir?

+0

merci pour la réponse ... mais j'essaie de trouver la raison derrière ce comportement dans Oracle. –

0

Depuis, pour les raisons rahularyansharma REPONSES, les requêtes basées sur ROWNUM fonctionnent pas toujours comme on pouvait s'y attendre, une façon de contourner cela est de faire quelque chose comme

SELECT * from (SELECT rownum AS rn, TABLE_NAME.* FROM TABLE_NAME) 
where rn > 5; 

Cependant, sachez que ce sera une opération assez inefficace lors de l'utilisation sur de grandes séries de données.