Pergunta

Eu tenho a seguinte consulta SQL:

select
     ID, COLUMN1, COLUMN2
from
     (select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
     NO between 0 and 100

O que estou tentando fazer é selecionar os primeiros 100 registros da consulta

select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC

E aqui estão os problemas:

  1. Aparentemente, a cláusula order by não está funcionando. Tenho notado que eu tenho que adicionar outra cláusula order by 2 DESC, logo após (...) from ATABLE, para minha consulta ao trabalho. Existe algo que eu fiz de errado? Ou é o comportamento esperado?

  2. Como posso adicionar uma cláusula where? Vamos dizer que eu preciso selecionar apenas os primeiros 100 registros do where COLUMN1 like '%value%' mesa. Eu tentei adicionar a cláusula WHERE após (...) from ATABLE mas produziu um erro ...

Ajuda? Obrigado.

PS:. Estou usando o Oracle 10g R2

Foi útil?

Solução

rownum é uma coluna pseudo que conta linhas no conjunto de resultados após o qual foi aplicado cláusula.

É isso que você está tentando obter?

SELECT *
FROM ( 
    SELECT id, column1, column2
    FROM atable ORDER BY 2 DESC
) 
WHERE ROWNUM < 100;

Porque é uma pseudo coluna que é estritamente um contador de linhas resultantes da cláusula onde não vai permitir que você faça a paginação (ou seja, entre 200 e 300).

Este é provavelmente o que você está procurando:

SELECT *
FROM
 (SELECT a.*, rownum rnum FROM
     (SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
WHERE rnum >= 200;

Outras dicas

Confira este o Oracle FAQ . Em particular esta parte:

  SELECT * 
  FROM (SELECT a.*, rownum RN 
      FROM (SELECT * 
                         FROM t1 ORDER BY key_column) a
         WHERE rownum <=7)
 WHERE rn >=5

Para responder à sua primeira pergunta: Não use um número de coluna em sua ordem por cláusula, mas usar o nome da coluna. Eu não entendo totalmente sua segunda pergunta, porque adicionar um WHERE em sua SELECIONAR mais interna deve fazer o truque:

select ID
,      COLUMN1
,      COLUMN2
from  (select ID
       ,      COLUMN1
       ,      COLUMN2
       ,      row_number() over (order by COLUMN1 DESC) NO
       from   A_TABLE
       where  COLUMNX LIKE '%SOME VALUE%'
      )
where  NO between 0 and 100

P.S. (A willcodejavaforfood) Acho que usando row_number () é melhor quando você quer as linhas a serem encomendados. Ele salva uma visão interior (grande vitória para facilitar a leitura).

Por que você não usar

Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc

Aqui você pode obter o registro limitada a partir do banco de dados Oracle sem o uso de rownum

select * from 
    ( select ,column1,column2,row_number() over (order by columnName) as rnum 
      from table_name) 
where rnum between 5 and 10;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top