当前位置: 首页 > 面试题库 >

关于WITH RECURSIVE查询Postgres的可能解释

班承恩
2023-03-14
问题内容

我一直在阅读Postgres中的With Query。这就是我很惊讶的地方

WITH RECURSIVE t(n) AS (
    VALUES (1)
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;

我不明白查询的评估是如何工作的。

  • t(n)听起来像是带有参数的函数。n的值如何传递。

关于SQL递归语句如何分解的任何见解。


问题答案:

这称为公用表表达式,是在SQL中表示递归查询的一种方式:

t(n)将CTE的名称定义为t,其中有一个名为的列n。它类似于派生表的别名:

select ... 
from (
  ...
) **_as t(n)_** ;

递归从值1开始(即values (1)部分值),然后递归地将值加1,直到达到99。因此它将生成从1到99的数字。然后最终查询将所有这些数字相加。

n是列名, 而不是 “变量”,并且“赋值”的发生方式与任何数据检索相同。

WITH RECURSIVE t(n) AS (
    VALUES (1) -- **< < this is the recursion "root"**
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100 -- **< < this is the "recursive part"**
)
SELECT sum(n) FROM t;

如果您“展开”递归(实际上是一个迭代),那么您将得到如下所示的结果:

select x.n + 1
from (
  select x.n + 1
  from (
    select x.n + 1
    from (
      select x.n + 1
      from (
         values (1)
      ) as x(n) 
    ) as x(n)
  ) as x(n)
) as x(n)

手册中的更多详细信息:https :
//www.postgresql.org/docs/current/static/queries-
with.html



 类似资料:
  • 查询是根据用户的请求用可读格式显示从数据库中提取的数据。Navicat 提供强大的查询工具:查询编辑器 - 可直接编辑查询文本,查询创建工具、查找创建工具或聚合创建工具 - 视觉化地创建查询。你可以保存查询,用于设置自动运行任务。在主窗口中,点击 “查询”来打开查询的对象列表。你亦可以在主工具栏点击 “新建查询”来创建一个新的查询而不必打开任何连接。 若要使用外部编辑器打开查询,请右击查询并选择“

  • 查询是根据用户的请求用可读格式显示从数据库中提取的数据。Navicat 提供强大的查询工具:查询编辑器 - 可直接编辑查询文本,查询创建工具、查找创建工具或聚合创建工具 - 视觉化地创建查询。你可以保存查询,用于设置自动运行任务。在主窗口中,点击 “查询”来打开查询的对象列表。你亦可以在主工具栏点击 “新建查询”来创建一个新的查询而不必打开任何连接。 若要使用外部编辑器打开查询,请按住 Contr

  • 查询是根据用户的请求用可读格式显示从数据库中提取的数据。Navicat 提供强大的查询工具:查询编辑器 - 可直接编辑查询文本,查询创建工具、查找创建工具或聚合创建工具 - 视觉化地创建查询。你可以保存查询,用于设置自动运行任务。在主窗口中,点击 “查询”来打开查询的对象列表。你亦可以在主工具栏点击 “新建查询”来创建一个新的查询而不必打开任何连接。 【提示】查询(.sql 或 .js)保存于设置

  • 在实例详细信息页面中,点击费时查询图表。 “费时查询”页面使用历史数据来帮助你识别消耗资源的长时间运行的查询,并调查性能问题的根本原因。数据是每秒收集并随时间自动压缩。 所有受监控的实例都显示在左侧窗格中。选择一个实例以查看其费时查询图表。 Navicat Monitor 提供了有关查询的几项附加信息。点击选项卡以显示相应的图表。可用选项卡取决于已选择实例的服务器类型。 【提示】当查看 SQL S

  • 我正在深入研究 java 并发 API,并试图了解读写锁的有用性。javadoc说读写块维护一对锁,一个用于读取,另一个用于写入操作。虽然写锁定是线程的独占访问,但多个线程可以获取读锁定。因此,如果在读取部分,我们所做的只是读取操作,并且无论如何我们都提供多个线程访问,那么首先需要读锁吗?是否存在读写锁实际上有用的情况?