我必须使用本机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作为数据库表中的一个字段?
答案 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是表的列名。