Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


quinta-feira, 10 de abril de 2008

Selecionando registros entre intervalos de linhas no Oracle com o ROWNUM

Por Eduardo Legatti

Olá,

Neste artigo, irei demonstrar como fazer uso da pseudo-coluna ROWNUM para obter os dados desejados dentro de um intervalo específico de um resultado de uma consulta SQL.


A técnica consiste em usar a estrutura SQL abaixo:

SELECT [[colunas]]
  FROM (SELECT [[colunas]], rownum rn
          FROM (SELECT [[colunas]]
                  FROM [[sua query]]
                  ORDER BY [[colunas]]) 
         WHERE rownum <= [[max row]])
  WHERE rn >= [[min row]]

onde
 

[[min row]] e [[max row]] são os números das linhas do intervalo desejado. Para demonstrar esta técnica, irei criar uma tabela de teste como demonstrado a seguir:

SQL> create table teste as select level id,
  2  substr(dbms_random.string('U',10),1,10) valor
  3  from dual connect by level <= 10;

Tabela criada.

SQL> select * from teste order by valor;

        ID VALOR
---------- ----------
         5 EMXMUNCOSZ
         9 GBXLYTGPPI
         2 MQIFNZHVZC
         6 NZPBZIGWXM
         8 SMHWOOIMQF
         3 TVKBNGOYVW
         4 TXJTLIPJGT
        10 VMPFTOKWKK
         1 VZIYRALBQQ
         7 WFZZJYYYPT

10 linhas selecionadas.


De acordo com o resultado acima, o que deverá ser feito para que possamos obter a quarta (4ª) e a quinta (5ª) linha da tabela (ID 6 e 8)?

SQL> SELECT id,valor,rownum
  2    FROM (SELECT id,valor
  3            FROM (SELECT id,valor
  4                  FROM teste
  5                  ORDER by valor));

        ID VALOR          ROWNUM
---------- ---------- ----------
         5 EMXMUNCOSZ          1
         9 GBXLYTGPPI          2
         2 MQIFNZHVZC          3
         6 NZPBZIGWXM          4
         8 SMHWOOIMQF          5
         3 TVKBNGOYVW          6
         4 TXJTLIPJGT          7
        10 VMPFTOKWKK          8
         1 VZIYRALBQQ          9
         7 WFZZJYYYPT         10

10 linhas selecionadas.


Então, de acordo com o resultado acima, sabemos que as linhas de ID 6 e 8 são as linhas que queremos obter. A seguir, irei aplicar a técnica como demonstrado abaixo:

SQL> set verify off
SQL> SELECT id,valor
  2        FROM (SELECT id,valor, rownum rn
  3                FROM (SELECT *
  4                       FROM (select id,valor from teste)
  5                       ORDER BY valor)
  6               WHERE rownum <= &maxrow)
  7        WHERE rn >= &minrow;
Informe o valor para maxrow: 5
Informe o valor para minrow: 4

        ID VALOR
---------- ----------
         6 NZPBZIGWXM
         8 SMHWOOIMQF

2 linhas selecionadas.



Nenhum comentário:

Postagens populares