PostgreSQL 中 FETCH FIRST 和 FETCH NEXT 有什么区别?

Ser*_*rev 2 postgresql offset-fetch

FETCH FIRSTPostgreSQL和PostgreSQL之间有什么区别FETCH NEXT?文档只是

NEXT 获取下一行

FIRST 获取查询的第一行

这没什么解释。我创建了一个包含示例行的示例表,并执行

SELECT * from users
FETCH FIRST 2 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)
SELECT * from users
FETCH NEXT 2 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

并得到完全相同的输出。它几乎就像 ifFETCH FIRSTFETCH NEXT只是同义词LIMIT(我读到,它不是 SQL 标准的一部分,与 不同FETCH [FIRST|NEXT]

如果两者相同,为什么文档不这么说?还是毕竟存在一些差异?

这个 Stack Overflow 答案意味着它们至少在某些 RDBMS 中可能以相同的方式运行,特别是在 MS Server 中

Dan*_*ité 9

您链接的文档页面的命令与SELECT 语句中的和选项FETCH不同 。后者的描述如下:FETCH FIRSTFETCH NEXTSELECT

获取{首先| 下一个 } [ 计数 ] { 行 | 行 } { 仅 | WITH TIES }
[...]
ROW 和 ROWS 以及 FIRST 和 NEXT 都是干扰词,不影响这些子句的效果

因此,在这种情况下,FIRST 和 NEXT 之间确实没有区别。

其行为与 LIMIT 相同,但 LIMIT 无法自动扩展计数以包含与最后一行具有相同排名的所有行,这与带有 WITH TIES 选项的 FETCH 不同。


对于游标的 FETCH 命令,FETCH NEXT 和 FETCH FIRST 的行为是不同的。例如以下语句序列:

BEGIN;
DECLARE c SCROLL CURSOR  FOR select generate_series(1,5) AS n;
FETCH FIRST c;
FETCH NEXT c;
FETCH FIRST c;
CLOSE C;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

显示FETCH FIRST c返回结果的第一行:

FETCH FIRST c;
 n 
---
 1
(1 row)

FETCH NEXT c;
 n 
---
 2
(1 row)

FETCH FIRST c;
 n 
---
 1
(1 row)
Run Code Online (Sandbox Code Playgroud)