在大多数 SQL 实现中,能够选择查询中返回的所有行的“滑动窗口”子集是很常见的事情。一个常见的用例是分页。例如,假设我有一个搜索页面,每页有 10 个结果。对于支持LIMIT
和OFFSET
关键字的实现,用于返回每个页面结果的查询如下:第一页将使用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
,但它们分别有一个名为ROWCOUNT
and的伪ROWNUM
列,可用于模拟嵌套选择的行为(请参阅此处和此处)。
在10.2B SQL 参考文档中,p49 有一个标题为TOP 子句的小节,它在底部说
SELECT TOP
是 Oracle 功能的等效ROWNUM
功能。请注意,SELECT TOP
它只是根据结果集大小的限制来定义的,优化器确定如何使用此限制来实现最佳数据访问。因此,SELECT TOP
并不具有所有用于定义 OracleROWNUM
短语含义的“程序规则”。
然而,这似乎是不准确的,因为根据TOP
's 的语法它不能用作像ROWNUM
can 这样的谓词(例如,我不能说SELECT * FROM Customer WHERE TOP > 5 AND TOP < 10
)。所以在功能TOP
上不等同于ROWNUM
.
有什么办法可以模仿OFFSET
,还是我运气不好?