我很难将存储过程从SQL Server转换为Oracle,以使我们的产品与之兼容.
我有查询根据时间戳返回一些表的最新记录:
SQL Server:
SELECT TOP 1 *
FROM RACEWAY_INPUT_LABO
ORDER BY t_stamp DESC
Run Code Online (Sandbox Code Playgroud)
=>这将使我回到最近的记录
但甲骨文:
SELECT *
FROM raceway_input_labo
WHERE rownum <= 1
ORDER BY t_stamp DESC
Run Code Online (Sandbox Code Playgroud)
=>那将返回最旧的记录(可能取决于索引),无论ORDER BY
声明如何!
我以这种方式封装了Oracle查询以满足我的要求:
SELECT *
FROM
(SELECT *
FROM raceway_input_labo
ORDER BY t_stamp DESC)
WHERE rownum <= 1
Run Code Online (Sandbox Code Playgroud)
它的工作原理.但这听起来像是一个可怕的黑客,特别是如果我在相关的表格中有很多记录.
实现这一目标的最佳方法是什么?
如何返回特定范围的ROWNUM
值?
我正在尝试以下方法:
select * from maps006 where rownum >49 and rownum <101
Run Code Online (Sandbox Code Playgroud)
这仅返回与<
运算符匹配的行.
ROWNUM
和之间有什么区别ROW_NUMBER
?
我试过以下查询:
select empno from (
select empno
from emp
order by sal desc
)
where rownum = 2
Run Code Online (Sandbox Code Playgroud)
这不会返回任何记录.
当我尝试这个查询
select rownum,empno from (
select empno from emp order by sal desc)
Run Code Online (Sandbox Code Playgroud)
它给了我这个输出:
ROWNUM EMPNO
1 7802
2 7809
3 7813
4 7823
Run Code Online (Sandbox Code Playgroud)
谁能告诉我第一次查询的问题是什么?为什么在添加ROWNUM过滤器时没有返回任何记录?
我想填充一个带有运行整数的表列,所以我想使用ROWNUM.但是,我需要根据其他列的顺序填充它,例如ORDER BY column1, column2
.遗憾的是,由于Oracle不接受以下声明,因此不可能:
UPDATE table_a SET sequence_column = rownum ORDER BY column1, column2;
Run Code Online (Sandbox Code Playgroud)
也不是以下语句(尝试使用WITH子句):
WITH tmp AS (SELECT * FROM table_a ORDER BY column1, column2)
UPDATE tmp SET sequence_column = rownum;
Run Code Online (Sandbox Code Playgroud)
那么如何使用SQL语句并且不依赖于PL/SQL中的游标迭代方法呢?
如何在Oracle 11g中的"选择"查询中添加偏移量.我只知道如何添加限制,例如rownum <= 5
这个问题不重复,我已经检查了其他问题并且与我的相关.
那么,如何在Oracle 11g中添加偏移量呢?
我想知道rowID
和之间的区别rowNUM
以及如何在我们的表中看到这两个.
当我执行这个:
SELECT * FROM emp WHERE rownum=1
Run Code Online (Sandbox Code Playgroud)
它返回一个查询,但是当我对rowid执行相同操作时,它说
不一致的数据类型:预期ROWID获得NUMBER
甚至在某些表中,rownum返回null.为什么这样?
请澄清一下:rowid vs rownum?(演示查询)
谢谢
编辑:需要使用别名来显示ROWID
和ROWNUM
(因为它们是伪列),如:
SELECT rownum r1, rowid r2 FROM emp
我正在使用oracle从购物应用中输出订单项.每个项目的数量字段可能大于1,如果是,我想将该行返回N次.
这就是我正在谈论的一张桌子
product_id, quanity
1, 3,
2, 5
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个可以返回的查询
1,3
1,3
1,3
2,5
2,5
2,5
2,5
2,5
Run Code Online (Sandbox Code Playgroud)
这可能吗?我看到了SQL Server 2005的这个答案,我正在寻找oracle中几乎所有的东西.遗憾的是,建立专用号码表不是一种选择.
这对我来说是一个永无止境的话题,我想知道我是否会忽视某些事情.基本上我在应用程序中使用两种类型的SQL语句:
现在,我们正在谈论针对具有数百万条记录的表的一些查询,加入另外5个具有数百万条记录的表.显然,我们几乎不想获取所有这些,这就是为什么我们有上述两种方法来限制用户查询.
案例1非常简单.我们只添加一个额外的ROWNUM
过滤器:
WHERE ...
AND ROWNUM < ?
Run Code Online (Sandbox Code Playgroud)
这是非常快的,因为Oracle的CBO将考虑其执行计划考虑此过滤器,并可能应用一个FIRST_ROWS
操作(类似于/*+FIRST_ROWS*/
提示强制执行的操作).
然而,案例2对Oracle来说有点棘手,因为LIMIT ... OFFSET
其他RDBMS中没有任何条款.因此,我们将"业务"查询嵌套在技术包装器中:
SELECT outer.* FROM (
SELECT * FROM (
SELECT inner.*, ROWNUM as RNUM, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS
FROM (
[... USER SORTED business query ...]
) inner
)
WHERE ROWNUM < ?
) outer
WHERE outer.RNUM > ?
Run Code Online (Sandbox Code Playgroud)
请注意,TOTAL_ROWS
即使不获取所有数据,也会计算该字段以了解我们将拥有多少页.现在这个分页查询通常非常令人满意.但是时不时(正如我所说,在查询5M +记录时,可能包括非索引搜索),这运行2-3分钟.
编辑:请注意,潜在的瓶颈并不容易规避,因为在分页之前必须应用排序!
我想知道,这是最先进的模拟LIMIT ... OFFSET
,包括TOTAL_ROWS
在Oracle中,还是有更好的解决方案,设计会更快,例如使用ROW_NUMBER() …
rownum ×10
sql ×8
oracle ×7
oracle10g ×2
oracle11g ×2
database ×1
pagination ×1
performance ×1
postgresql ×1
repeat ×1
row-number ×1
rowid ×1
select ×1
sql-order-by ×1
sql-update ×1