3

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

无论如何,我试图在 OpenEdge 的 SQL 引擎中模仿这个功能。我已经发现SELECT TOP它基本上等同于LIMIT,但是我找不到任何类似的东西OFFSET(我认为没有确切的等价物)。SQL Server 和 Oracle 也缺少OFFSET,但它们分别有一个名为ROWCOUNTand的伪ROWNUM列,可用于模拟嵌套选择的行为(请参阅此处此处)。

10.2B SQL 参考文档中,p49 有一个标题为TOP 子句的小节,它在底部说

SELECT TOP是 Oracle 功能的等效ROWNUM 功能。请注意,SELECT TOP它只是根据结果集大小的限制来定义的,优化器确定如何使用此限制来实现最佳数据访问。因此,SELECT TOP并不具有所有用于定义 OracleROWNUM 短语含义的“程序规则”。

然而,这似乎是不准确的,因为根据TOP's 的语法它不能用作像ROWNUMcan 这样的谓词(例如,我不能说SELECT * FROM Customer WHERE TOP > 5 AND TOP < 10)。所以在功能TOP等同于ROWNUM.

有什么办法可以模仿OFFSET,还是我运气不好?

4

1 回答 1

6

OpenEdge 11.2 增加了对 SQL查询的支持OFFSETFETCH子句;SELECT低于 11.2 的 OpenEdge 版本不支持OFFSET/ FETCH

来自11.2 产品文档“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.

值得注意的是TOPand OFFSET/FETCH子句是互斥的——TOP不能在使用OFFSETor的查询中使用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;
于 2012-06-11T14:42:50.207 回答