如何在Postgresql中正确使用FETCH FIRST?

如何在Postgresql中正确使用FETCH FIRST?,postgresql,Postgresql,我试图找出如何只选择select查询的第一个元素 似乎很多人使用限制1只选择第一个,但这似乎不是最好的方法 我正在阅读Postgresql文档中的SELECT,似乎有一个FETCH语句的选项,但我在网上找不到任何示例,有人能给我解释一下如何正确使用它吗?以下语句是等效的: SELECT * FROM foo LIMIT 10; 及 行可以与行互换,这使得获取1在语法上更加一致 FETCH FIRST X ROWS ONLY是SQL标准的一部分,而据我回忆,LIMIT不是LIMIT非常流行,而且

我试图找出如何只选择select查询的第一个元素

似乎很多人使用限制1只选择第一个,但这似乎不是最好的方法


我正在阅读Postgresql文档中的SELECT,似乎有一个FETCH语句的选项,但我在网上找不到任何示例,有人能给我解释一下如何正确使用它吗?

以下语句是等效的:

SELECT * FROM foo LIMIT 10;

可以与
互换,这使得获取1在语法上更加一致

FETCH FIRST X ROWS ONLY
是SQL标准的一部分,而据我回忆,
LIMIT
不是
LIMIT
非常流行,而且更加简洁,因此postgres也支持它

编辑以添加:这两个语句仅在语法上不同。它们生成完全相同的计划:

=# explain select * from foo fetch first 10 row only;
                         QUERY PLAN                          
-------------------------------------------------------------
 Limit  (cost=0.00..0.22 rows=10 width=68)
   ->  Seq Scan on foo  (cost=0.00..18.50 rows=850 width=68)

=# explain select * from foo limit 10;
                         QUERY PLAN                          
-------------------------------------------------------------
 Limit  (cost=0.00..0.22 rows=10 width=68)
   ->  Seq Scan on foo  (cost=0.00..18.50 rows=850 width=68)

就性能而言,这两者是相同的吗?他们只是做同样的事,但用词不同是的,完全一样。纯粹是句法上的差异。我已经发布了上面相同的解释计划(针对我的简单查询和小测试表)。尝试对具有多行的表执行测试,我认为DB之所以选择Seq scan是因为记录数小。为什么存在这两种语法?一种是SQL标准,另一种是流行但非标准的扩展。后者并非起源于博士后,但他们最终还是支持了它。如果你需要例子的话,那就是它。但是如果您只需要查询的第一行,那么使用
limit
是最好的方法(在大多数情况下)。@Abelisto best?这是一种古老的非标准方式。
=# explain select * from foo fetch first 10 row only;
                         QUERY PLAN                          
-------------------------------------------------------------
 Limit  (cost=0.00..0.22 rows=10 width=68)
   ->  Seq Scan on foo  (cost=0.00..18.50 rows=850 width=68)

=# explain select * from foo limit 10;
                         QUERY PLAN                          
-------------------------------------------------------------
 Limit  (cost=0.00..0.22 rows=10 width=68)
   ->  Seq Scan on foo  (cost=0.00..18.50 rows=850 width=68)