在大多数SQL实现中,能够选择查询中返回的所有行的“滑动窗口”子集是很常见的。一个常见的用例是分页。例如,假设我有一个搜索页面,每页有10个结果。对于支持LIMIT
和OFFSET
关键字的实现,用于返回每个页面结果的查询如下:第一页将使用SELECT ... LIMIT 10 OFFSET 0
,第2页将使用SELECT ... LIMIT 10 OFFSET 10
,第3页将使用SELECT ... LIMIT 10 OFFSET 20
等(请注意OFFSET
在LIMIT
之前生效。)
无论如何,我试图在OpenEdge的SQL引擎中模仿这个功能。我已经发现SELECT TOP
基本上等同于LIMIT
,但是找不到与OFFSET
类似的内容(我认为没有 exact < / em>等价物)。 SQL Server和Oracle也缺少OFFSET
,但它们分别有一个名为ROWCOUNT
和ROWNUM
的伪列,可以用来模拟使用嵌套选择的行为(参见here }和here)。
在10.2B SQL Reference doc,p49中有一个名为 TOP子句的小节,底部显示
SELECT TOP
是OracleROWNUM
的功能等价物 功能。请注意,SELECT TOP
仅根据a来定义 限制结果集大小,优化程序确定如何使用 此限制可获得最佳数据访问权限因此,SELECT TOP
并不是全部 用于定义OracleROWNUM
含义的“程序规则” 短语。
然而,这似乎是不准确的,因为根据TOP
的语法,它不能用作ROWNUM
之类的谓词(例如,我不能说SELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
)。因此TOP
不在功能上等同于ROWNUM
。
有没有办法模仿OFFSET
,还是我运气不好?
答案 0 :(得分:4)
OpenEdge 11.2增加了对OFFSET
and FETCH
clauses到SQL SELECT
查询的支持;低于11.2的OpenEdge版本不支持OFFSET
/ FETCH
。
来自11.2 product documentation“SQL参考”文档:
The OFFSET clause specifies the number of rows to skip, before starting to return rows
from the query expression. The FETCH clause specifies the number of rows to return,
after processing the OFFSET clause.
值得注意的是, TOP
和OFFSET
/ FETCH
条款是互斥的 - TOP
不能在使用的查询中使用OFFSET
或FETCH
。
跳过前10行并返回其余的限定行:
SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders OFFSET 10;
返回前10行而不跳过任何:
SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC
FETCH FIRST 10 ROWS ONLY;
在查询的结果集中返回第51行到第60行:
SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC
OFFSET 50 ROWS FETCH NEXT 10 ROWS ONLY;