postgres/oracle中带offset和fetch子句的sql查询删除记录的行为

vmpqdwk3  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(540)

我的问题是:

select * from mytable order by mycol_1 OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;

现在,如果在这个迭代中,我从上述查询获取的10条记录中删除了几条记录,然后运行:

select * from mytable order by mycol_1 OFFSET 10 ROWS FETCH FIRST 10 ROWS ONLY;

我将获得真正的下10条记录,还是sql引擎将某些行上移,从而跳过某些行?

hfyxw5xn

hfyxw5xn1#

例如:如果您有20行(假设这些是从1到20的序数)并删除例如2、4、6、8、10,然后运行第2条语句( offset 10 ):它将“跳过”值1、3、5、7、9、11、12、13、14、15(使offset=10)并从16开始返回值。
如果你再次使用 offset 0 ,您将得到1、3、5、7、9、11、12、13、14、15,这意味着不会跳过任何内容(当然,除了已删除的行,它们不再存在)。
基本上,这意味着你可以省略 OFFSET 与…一起工作 FETCH FIRST 10 ROWS ONLY 选项。
顺便说一下,你使用 order by 条款;我见过一些人“希望”查询会自动返回行,他们认为“sql会返回,但是-没有 order by 条款,这是不可预测的。

相关问题