如何在OpenEdge SQL中模仿SELECT ... LIMIT,OFFSET?

时间:2012-06-08 14:48:18

标签: progress-4gl openedge

在大多数SQL实现中,能够选择查询中返回的所有行的“滑动窗口”子集是很常见的。一个常见的用例是分页。例如,假设我有一个搜索页面,每页有10个结果。对于支持LIMITOFFSET关键字的实现,用于返回每个页面结果的查询如下:第一页将使用SELECT ... LIMIT 10 OFFSET 0,第2页将使用SELECT ... LIMIT 10 OFFSET 10 ,第3页将使用SELECT ... LIMIT 10 OFFSET 20等(请注意OFFSETLIMIT之前生效。)

无论如何,我试图在OpenEdge的SQL引擎中模仿这个功能。我已经发现SELECT TOP基本上等同于LIMIT,但是找不到与OFFSET类似的内容(我认为没有 exact < / em>等价物)。 SQL Server和Oracle也缺少OFFSET,但它们分别有一个名为ROWCOUNTROWNUM的伪列,可以用来模拟使用嵌套选择的行为(参见here }和here)。

10.2B SQL Reference doc,p49中有一个名为 TOP子句的小节,底部显示

  

SELECT TOP是Oracle ROWNUM的功能等价物   功能。请注意,SELECT TOP仅根据a来定义   限制结果集大小,优化程序确定如何使用   此限制可获得最佳数据访问权限因此,SELECT TOP并不是全部   用于定义Oracle ROWNUM含义的“程序规则”   短语。

然而,这似乎是不准确的,因为根据TOP的语法,它不能用作ROWNUM之类的谓词(例如,我不能说SELECT * FROM Customer WHERE TOP > 5 AND TOP < 10)。因此TOP 在功能上等同于ROWNUM

有没有办法模仿OFFSET,还是我运气不好?

1 个答案:

答案 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.

值得注意的是, TOPOFFSET / FETCH条款是互斥的 - TOP不能在使用的查询中使用OFFSETFETCH

来自文档的示例查询:

跳过前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;