从oracle数据库中选择n条记录

时间:2015-08-19 16:16:44

标签: sql oracle native-sql

我必须使用本机sql从sap中选择oracle数据库中的n行。在open sql中,查询就像

    select * from myDB where size > 2000 upto n rows.

我从其他帖子中学到了等效的本机sql查询

    SELECT * FROM myDB WHERE SIZE > 2000 AND rownum <= 100

这是正确的吗?

我是否需要将rownum作为数据库表中的一个字段?

3 个答案:

答案 0 :(得分:1)

ROWNUM是Oracle在您执行SELECT时生成的伪列。将值赋值给ROWNUM是在查询返回行之前完成的最后一件事 - 因此,查询发出的第一行是ROWNUM = 1,查询发出的第二行是ROWNUM = 2 , 等等。注意:这意味着像下面这样的语句将返回NO ROWS:

SELECT *
  FROM SOME_TABLE
  WHERE ROWNUM >= 2

为什么这不返回任何行?这是因为查询将发出的第一行总是给出ROWNUM = 1,并且因为查询仅查找具有ROWNUM&gt; = 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的计算列,然后我们可以将其用作外部查询中的普通列

答案 1 :(得分:1)

SELECT *
FROM   myDB
WHERE  SIZE   > 2000
AND    ROWNUM <= 100

语法正确的查询。

  

我是否需要将rownum作为数据库表中的一个字段?

不,ROWNUM pseudocolumn为查询返回的每一行指定一个数字,表示Oracle从一个表或一组连接的行中选择行的顺序。选中的第一行的ROWNUM为1,第二行为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;

答案 2 :(得分:0)

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

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

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