1

我必须使用本机 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 作为数据库表中的字段之一?

4

3 回答 3

4
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;
于 2015-08-20T10:57:41.963 回答
2

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 的计算列,然后我们可以将其用作外部查询中的普通列。

于 2015-08-19T22:40:57.033 回答
0

使用rownum 概念它是oracle 中的一个伪列,利用这个概念我们可以实现TOP关键字功能。

select col1,col2,col3..coln from
(
select rownum rn,e.* from mydb where size>2000
)
where rn>N

注意: Col1 到 coln 是表的列名。

于 2015-08-20T05:00:47.583 回答