我有以下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
我要做的是选择查询的前100条记录
select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC
以下是问题:
显然,order by
子句不起作用。我注意到我必须在order by 2 DESC
之后添加另一个(...) from ATABLE
子句,以使我的查询起作用。有什么我做错了吗?或者是预期的行为?
如何添加where
子句?假设我只需要选择表where COLUMN1 like '%value%'
的前100条记录。我已经尝试在(...) from ATABLE
之后添加where子句但是它产生了错误...
帮助?感谢。
PS:我正在使用Oracle 10g R2。
答案 0 :(得分:9)
rownum是一个伪列,用于在应用where子句后对结果集中的行进行计数。
这是你想要得到的吗?
SELECT *
FROM (
SELECT id, column1, column2
FROM atable ORDER BY 2 DESC
)
WHERE ROWNUM < 100;
因为它是一个伪列,它严格地是由where子句产生的行的计数器,所以它不允许你进行分页(即在200和300之间)。
这可能就是你要找的东西:
SELECT *
FROM
(SELECT a.*, rownum rnum FROM
(SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
WHERE rnum >= 200;
答案 1 :(得分:3)
Check out this Oracle FAQ。特别是这部分:
SELECT *
FROM (SELECT a.*, rownum RN
FROM (SELECT *
FROM t1 ORDER BY key_column) a
WHERE rownum <=7)
WHERE rn >=5
答案 2 :(得分:2)
回答第一个问题:不要在order by子句中使用列号,而是使用列名。 我不完全理解你的第二个问题,因为在你最内在的SELECT中添加一个WHERE应该可以解决这个问题:
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。 (to willcodejavaforfood)我认为当你想要排序行时,使用row_number()会更好。它保存了一个内部视图(可读性大赢)。
答案 3 :(得分:0)
为什么不使用
Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc
答案 4 :(得分:0)
在这里,您将从Oracle数据库中获取有限的记录,而无需使用rownum
select * from
( select ,column1,column2,row_number() over (order by columnName) as rnum
from table_name)
where rnum between 5 and 10;