我正在使用OFFSET x ROWS FETCH NEXT y ROWS ONLY
功能的一个oracle sql调用中编写一个分页功能,而我在如何不使用重复数字的情况下难以解决问题。
当前,我正在C#端执行类似的操作,其中_currOffset
是x
,而_nextOffset
是y
。
private int _currOffset = 0;
private int _maxFetchCount = 499;
private int _maxOffset = 2020;
private int _nextOffset = 0;
while(_currOffset < _maxOffset) {
// If we are going to go over _maxOffset, just take the difference
_nextOffset = (_currOffset + _maxFetchCount > _maxOffset) ? _maxOffset - _currOffset : _maxFetchCount;
// Call Database using _currOffset and _nextOffset
// .... OFFSET _currOffset ROWS FETCH NEXT _nextOffset ROWS ONLY
_currOffset += _nextOffset + 1;
}
这对于两次迭代都可以正常工作,因为_currOffset
将是0
,而_nextOffset
将是499
,并且第一次是_currOffset
是{{ 1}}和500
仍然是第二次迭代的_nextOffset
。
对于第三次迭代,499
现在为_currOffset
,这是错误。它应该保留为501
。
我基本上想查询大块而不重复偏移量。
从1 + <the last offset I ended with>
查询到0
从499
查询到500
从999
查询到1000
从1499
查询到1500
从1999
查询到1999
(在这种情况下,if条件会将2020
设置为_nextOffset
)
如何更改变量分配以处理此问题?我不能只删除21
,因为我会在sql查询中两次查询相同的偏移量。 (当我想从_currOffset += _nextOffset + 1
开始进行第二次迭代时,我将以499
结束第一次迭代,而以499
进行第二次迭代)
答案 0 :(得分:0)
可以进行一些更改以使您获得所需的值:
while
的值是最后一项索引的start
,就运行<=
条件。 size
时,我们将1
添加到true
条件中(当start + maxSize > lastItem
时),以便将第一个项目包括在尺寸中(例如,5 - 1
是4
,但是从1
到5
的项数实际上是5
),所以size
变成了{{1} }。lastItem - start + 1
。例如,如果我们的大小为start + size - 1
,起始项目为2
,则最后一项为5
(6
+ 5
-{{ 1}})2
添加到1
值中代码示例
size
请注意,我重命名了您的变量,因此代码更加简洁。它们的映射如下:
start
private static void Main()
{
var start = 0;
var maxSize = 500;
// Note that this represents the last item's *index*
// There are actually 2021 total items, since the first item is at index '0'
var lastItem = 2020;
while (start <= lastItem)
{
int size = start + maxSize > lastItem
? lastItem - start + 1
: maxSize;
Console.WriteLine($"Query from {start} to {start + size - 1} ({size} items)");
start += size;
}
GetKeyFromUser("\nDone! Press any key to exit...");
}
_currOffset = start
_maxFetchCount = maxSize
输出