我必须使用本地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作为数据库表中的一个字段吗?
我必须使用本地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作为数据库表中的一个字段吗?
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的计算列,然后我们可以在外部查询中将其用作普通列。
好的答案,但你在内部查询中缺少一个ORDER BY' - 否则它没有意义获得行“5”但不是行“4”。 –
@JeffreyKemp - ORDER BY added。谢谢。 –
“ROWNUM是Oracle生成的伪列,当你执行SELECT时......或者更新或删除。事实上,在任何聚合步骤发生之前,rownum都会被应用,因此:“select count(*)from ...其中rownum <2”只能返回0或1,并且是行存在的上帝测试。 –
使用rownum概念它是oracle中的一个伪列,通过使用这个概念我们可以实现TOP
关键字的功能。
select col1,col2,col3..coln from
(
select rownum rn,e.* from mydb where size>2000
)
where rn>N
注意:Col1到coln是您的表的列名称。
SELECT *
FROM myDB
WHERE SIZE > 2000
AND ROWNUM <= 100
是一个在语法上正确的查询。
我需要将rownum作为DB表中的一个字段吗?
否,ROWNUM
pseudocolumn受让人,对于查询所返回的每一行,一个数字,指示在其中的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;
为什么不使用** Select Top **? – code
@code - 因为Oracle不支持'TOP' –
是的,但是你已经有了oracle的等价物** rownum **为什么不工作 – code