Abe*_*ker 3 progress-4gl openedge
在大多数 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(我认为没有完全等效的东西)。SQL Server 和 Oracle 也缺少一个OFFSET,但它们有一个分别称为ROWCOUNT和 的伪列ROWNUM,可用于模仿使用嵌套选择的行为(请参阅此处和此处)。
在10.2B SQL 参考文档第 49 页中,有一个名为TOP 子句的小节位于底部
SELECT TOP是与 Oracle 功能等效的功能ROWNUM。请注意,它SELECT TOP只是根据结果集大小的限制来定义,优化器确定如何使用此限制来实现最佳数据访问。因此,SELECT TOP并没有所有的“程序规则”用来定义OracleROWNUM短语的含义。
然而,这似乎不准确,因为根据TOP的语法,它不能用作像 can 这样的谓词ROWNUM(例如 I can't say SELECT * FROM Customer WHERE TOP > 5 AND TOP < 10)。So在功能上TOP不等同于ROWNUM.
有什么办法可以模仿吗OFFSET,还是我运气不好?
OpenEdge 11.2 添加了对 SQL查询的支持OFFSET和FETCH子句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.
Run Code Online (Sandbox Code Playgroud)
值得注意的是TOPand OFFSET/FETCH子句是互斥的-不能在使用or 的TOP查询中使用。OFFSETFETCH
跳过前 10 行并返回其余符合条件的行:
SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders OFFSET 10;
Run Code Online (Sandbox Code Playgroud)
返回前 10 行而不跳过任何行:
SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC
FETCH FIRST 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)
返回查询结果集中的第 51 行到第 60 行:
SELECT OrderID,OrderDate,custID,filler
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC
OFFSET 50 ROWS FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7852 次 |
| 最近记录: |