【问题标题】:How to correctly use FETCH FIRST in Postgresql?如何在 Postgresql 中正确使用 FETCH FIRST?
【发布时间】:2016-07-19 19:50:09
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您需要示例 - 它的 here。但是,如果您只需要查询中的第一行,那么使用 limit 是最好的方法(在大多数情况下)。
  • @Abelisto 最好?这是旧的非标准方式。

标签: postgresql


【解决方案1】:

以下语句是等价的:

SELECT * FROM foo LIMIT 10;

SELECT * FROM foo FETCH FIRST 10 ROWS ONLY;

ROWS 可与 ROW 互换,这使得仅获取 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)

【讨论】:

  • 性能方面,这两个是一样的吗?他们只是做同样的事情,但措辞不同
  • 是的,一模一样。纯粹是句法上的区别。我已经在上面发布了相同的解释计划(针对我的简单查询和小型测试表)。
  • 尝试对多行表进行测试,我认为数据库选择的 Seq 扫描是因为记录数少
  • 为什么存在这两种语法?
  • 一个是SQL标准,另一个是流行但非标准的扩展。后者并非起源于 postgres,但他们最终支持它。
猜你喜欢
  • 2017-12-24
  • 2022-12-31
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2013-08-22
  • 2019-07-17
  • 2018-02-05
相关资源
最近更新 更多