【发布时间】:2019-12-21 13:50:05
【问题描述】:
我正在使用 oracle 12c 数据库,并且我有一个具有以下结构的表:
Id NUMBER
SeqNo NUMBER
Val NUMBER
Valid VARCHAR2
使用字段 Id 和 SeqNo 创建复合主键。
我想使用 Valid = 'Y' 获取数据并应用页面大小为 3 的 ketset 分页。假设我有以下数据:
Id SeqNo Val Valid
1 1 10 Y
1 2 20 N
1 3 30 Y
1 4 40 Y
1 5 50 Y
2 1 100 Y
2 2 200 Y
预期结果:
----------------------------
Page 1
----------------------------
Id SeqNo Val Valid
1 1 10 Y
1 3 30 Y
1 4 40 Y
----------------------------
Page 2
----------------------------
Id SeqNo Val Valid
1 5 50 Y
2 1 100 Y
2 2 200 Y
偏移分页可以这样完成:
SELECT * FROM table ORDER BY Id, SeqNo OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;
然而,在实际的数据库中,它有超过 500 万条记录,使用 OFFSET 会大大降低查询速度。因此,我正在寻找一种 ketset 分页方法(使用一些唯一字段而不是 OFFSET 跳过记录)
由于使用了复合主键,我需要使用来自多个字段的信息来偏移页面。
这是一个应该在 PostgreSQL 中工作的示例 SQL(获取第二页):
SELECT * FROM table WHERE (Id, SeqNo) > (1, 4) AND Valid = 'Y' ORDER BY Id, SeqNo LIMIT 3;
我如何在 oracle 中实现相同的目标?
【问题讨论】:
标签: sql oracle pagination