SQL Query Com Row_Number, encomenda por e onde cláusula
-
08-07-2019 - |
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 ??p>
select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC
E aqui estão os problemas:
-
Aparentemente, a cláusula
order by
não está funcionando. Tenho notado que eu tenho que adicionar outra cláusulaorder by 2 DESC
, logo após(...) from ATABLE
, para minha consulta ao trabalho. Existe algo que eu fiz de errado? Ou é o comportamento esperado? -
Como posso adicionar uma cláusula
where
? Vamos dizer que eu preciso selecionar apenas os primeiros 100 registros dowhere 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
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;