我必须使用本机 sql 从 sap 的 oracle 数据库中选择 n 行。在开放的 sql 中,查询就像
select * from myDB where size > 2000 upto n rows.
我从其他帖子中学到的等效本机 sql 查询将是
SELECT * FROM myDB WHERE SIZE > 2000 AND rownum <= 100
这个对吗?
我是否需要将 rownum 作为数据库表中的字段之一?
我必须使用本机 sql 从 sap 的 oracle 数据库中选择 n 行。在开放的 sql 中,查询就像
select * from myDB where size > 2000 upto n rows.
我从其他帖子中学到的等效本机 sql 查询将是
SELECT * FROM myDB WHERE SIZE > 2000 AND rownum <= 100
这个对吗?
我是否需要将 rownum 作为数据库表中的字段之一?
SELECT *
FROM myDB
WHERE SIZE > 2000
AND ROWNUM <= 100
是一个语法正确的查询。
我是否需要将 rownum 作为数据库表中的字段之一?
不,ROWNUM
伪列为查询返回的每一行分配一个数字,指示 Oracle 从表或连接行集中选择行的顺序。选择的第一行的 aROWNUM
为 1,第二行的 a 为 2,依此类推。
请注意,ROWNUM
它适用于任何ORDER BY
子句之前。
所以:
SELECT *
FROM myDB
WHERE ROWNUM <= 10
ORDER BY column_name
将选择 10 行(可以是任意 10 行,不一定是所需排序中的第一个 10 行),然后按所需列对这 10 行进行排序。
如果要获取列的前 N 个值的行,则需要应用第一个值ORDER BY
,然后限制行数:
SELECT *
FROM ( SELECT *
FROM myDB
ORDER BY column_name )
WHERE ROWNUM <= 10
如果您使用的是 Oracle 12,那么他们为 TOP-N 查询实现了一种新语法:
SELECT *
FROM myDB
ORDER BY column_name
FETCH FIRST 10 ROWS ONLY;
ROWNUM
是 Oracle 在您执行SELECT
. 对值的赋值ROWNUM
是查询返回一行之前完成的最后一件事——因此,查询发出的第一行被赋予 ROWNUM = 1,查询发出的第二行被赋予 ROWNUM = 2,依此类推。注意:这意味着像下面这样的语句将不会返回任何行:
SELECT *
FROM SOME_TABLE
WHERE ROWNUM >= 2
为什么这不返回任何行?这是因为查询发出的第一行总是给定 ROWNUM = 1,并且由于查询只查找 ROWNUM >= 2 的行,因此不会选择行,因为第一个 ROWNUM 值 1 应用于第一个行发射。
但是 - 如果你真的想获得除第一行(或前 10 行,或者你有什么)之外的所有行,你可以这样做:
SELECT *
FROM (SELECT *, ROWNUM AS INNER_ROWNUM
FROM SOME_TABLE
WHERE SOMETHING = SOMETHING_ELSE
ORDER BY WHATEVER) i
WHERE i.INNER_ROWNUM IN (1, 2, 3, 5, 7, 11, 13, 17, 19);
在这里,我们使用内部 SELECT 获取给定条件 (SOMETHING = SOMETHING_ELSE) 的所有行,并将来自 INNER 查询的 ROWNUM 分配给名为 INNER_ROWNUM 的计算列,然后我们可以将其用作外部查询中的普通列。
使用rownum 概念它是oracle 中的一个伪列,利用这个概念我们可以实现TOP
关键字功能。
select col1,col2,col3..coln from
(
select rownum rn,e.* from mydb where size>2000
)
where rn>N
注意: Col1 到 coln 是表的列名。