在大多数 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,但它们分别有一个名为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,还是我运气不好?