2015-08-19 169 views
0

我必须使用本地sql从sap中的oracle数据库中选择n行。在打开SQL查询会像从oracle数据库中选择n条记录

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

我从其他的帖子了解到相当于原生SQL查询将

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

这是正确的?

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

+0

为什么不使用** Select Top **? – code

+2

@code - 因为Oracle不支持'TOP' –

+0

是的,但是你已经有了oracle的等价物** rownum **为什么不工作 – code

回答

1

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

+0

好的答案,但你在内部查询中缺少一个ORDER BY' - 否则它没有意义获得行“5”但不是行“4”。 –

+0

@JeffreyKemp - ORDER BY added。谢谢。 –

+0

“ROWNUM是Oracle生成的伪列,当你执行SELECT时......或者更新或删除。事实上,在任何聚合步骤发生之前,rownum都会被应用,因此:“select count(*)from ...其中rownum <2”只能返回0或1,并且是行存在的上帝测试。 –

0

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

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

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

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

是一个在语法上正确的查询。

我需要将rownum作为DB表中的一个字段吗?

否,ROWNUMpseudocolumn受让人,对于查询所返回的每一行,一个数字,指示在其中的Oracle从一个表选择行或一组连接的行的顺序。所选的第一行具有1的ROWNUM,第二行具有2,依此类推。

请注意,ROWNUM适用于任何ORDER BY条款之前。

所以:

SELECT * 
FROM myDB 
WHERE ROWNUM <= 10 
ORDER BY column_name 

可否选择10行(它可以是任何的10行,而不一定是10行,其是首先在期望的顺序)和然后将所需的列顺序那些10行。

如果你想获得与前N个值的行,列,那么你需要应用ORDER BY第一,然后限制行数:如果您使用的是Oracle 12然后

SELECT * 
FROM (SELECT * 
     FROM myDB 
     ORDER BY column_name) 
WHERE ROWNUM <= 10 

他们已经实现了TOP-N查询的新语法:

SELECT * 
FROM myDB 
ORDER BY column_name 
FETCH FIRST 10 ROWS ONLY; 
相关问题