Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como ROWNUM funciona na consulta de paginação?


Você tem 4 perguntas, e todas giram em torno do uso e da funcionalidade de ROWNUM . Vou responder a cada pergunta uma a uma.

Por que (esta foi minha primeira tentativa até pesquisar SO) Selecione * From Person Where rownum> 100 e rownum <110; retorna 0 linhas?

Boa explicação de Thomas Kyte sobre ROWNUM e paginação aqui.

Um ROWNUM o valor é atribuído a uma linha após passar pela fase de predicado da consulta, mas antes que a consulta faça qualquer classificação ou agregação. Além disso, um valor ROWNUM é incrementado somente após ser atribuído, razão pela qual a consulta a seguir nunca retornará uma linha:
select * 
  from t 
 where ROWNUM > 1;

Como ROWNUM> 1 não é verdadeiro para a primeira linha, ROWNUM não avança para 2. Portanto, nenhum valor de ROWNUM pode ser maior que 1.

Por que não há uma maneira simples de fazer algo como Select... FROM... WHERE rownum BETWEEN lowerBound AND upperBound?

Sim existe. Do Oracle 12c em diante, você pode usar a nova limitação de n linhas superiores característica. Veja minha resposta aqui.

Por exemplo, a consulta abaixo retornaria os funcionários entre 4º mais alto até 7º maior salário em ordem ascendente:
SQL> SELECT empno, sal
  2  FROM   emp
  3  ORDER BY sal
  4  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

     EMPNO        SAL
---------- ----------
      7654       1250
      7934       1300
      7844       1500
      7499       1600

SQL>

Como se livrar da coluna r nos valores resultantes?

Em vez de select * , liste os nomes de coluna necessários na consulta externa. Para o uso frequente da consulta, a criação de uma visualização é uma atividade simples e única.

Como alternativa, em SQL*Plus você pode usar o NOPRINT comando. Ele não exibirá o nome da coluna que você não deseja exibir. No entanto, só funcionaria no SQL*Plus.

Por exemplo,
COLUMN column_name NOPRINT

Por exemplo,
SQL> desc dept
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------
 DEPTNO                                             NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;

    DEPTNO
----------
        10
        20
        30
        40

SQL>

Garante a paginação correta?

Sim, se você escrever a consulta de paginação corretamente.

Por exemplo,
SELECT val
FROM   (SELECT val, rownum AS rnum
        FROM   (SELECT val
                FROM   t
                ORDER BY val)
        WHERE rownum <= 8)
WHERE  rnum >= 5;

       VAL
----------
         3
         3
         4
         4

4 rows selected.

SQL>

Ou use o novo recurso de limitação de linha no 12c, como mostrei acima.

Alguns bons exemplos aqui.