问题标签 [recursive-cte]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4227 浏览

sql-server - SQL Server:选择父子

我有一个SQL Server 2008,其中有一个名为ProductCategories的表,其设计如下:

我想从此表中进行选择,并获得如下结果集:

我试过这个,但这显然给了我没有 ParentId 的那些:

如果可以,请你帮助我 :)

—— 不懂SQL的家伙

0 投票
4 回答
2038 浏览

sql-server - 递归 CTE 问题

我试图在 SQL Server 中使用递归 CTE 从包含基础树结构的表中构建谓词公式。例如,我的表如下所示:

...表示 ((a > alpha) AND (b > beta)) OR ((c > gamma) AND (a < delta))。

ParentId 是对父节点同表中的Id的引用。

我想编写一个查询,它将从表中构建这个字符串。可能吗?

谢谢

0 投票
1 回答
2388 浏览

sql - 使用递归公用表表达式,如 while 循环

我有下表

给定日期作为参数,我必须找到编号。或使用递归 cte从开始日期到一个月后每天记录的日志计数。 有些日子可能没有任何日志,所以我必须将计数打印为 0。

前任:

返回

对于 2011-01-17 作为输入,输出应为

我必须使用递归cte 来做到这一点。我不知道如何在每次递归中将日期增加 1 以及如何停止\终止递归。

这是我到目前为止所做的事情:

0 投票
1 回答
2063 浏览

sql - 为什么递归 CTE 以程序方式运行分析函数 (ROW_NUMBER)?

我昨天回答了一个递归 CTE,它暴露了在 SQL Server 中实现这些方法的问题(也可能在其他 RDBMS 中?)。基本上,当我尝试ROW_NUMBER针对当前递归级别使用时,它会针对当前递归级别的每一行子集运行。我希望这将在真正的 SET 逻辑中工作,并针对整个当前递归级别运行。

从这篇 MSDN 文章看来,我发现的问题是预期的功能:

CTE 递归部分中的分析和聚合函数应用于当前递归级别的集合,而不是应用于 CTE 的集合。像 ROW_NUMBER 这样的函数只对当前递归级别传递给它们的数据子集进行操作,而不是传递给 CTE 递归部分的整个数据集。有关更多信息,请参阅 J. 在递归 CTE 中使用分析函数。

在我的挖掘中,我找不到任何地方可以解释为什么选择它以它的方式工作?这更像是基于集合的语言中的一种程序方法,因此这与我的 SQL 思维过程相悖,并且在我看来非常令人困惑。有人知道和/或有人可以解释为什么递归 CTE 以程序方式在递归级别处理分析函数吗?


这是帮助可视化的代码:

请注意,RowNumber每个代码输出中的列。

这是 CTE 的 SQLFiddle(仅显示第二级递归)

这是我期望 CTE 做的第二个 SQLFiddle(再次只需要第二级来显示问题)

我一直设想 SQL 递归 CTE 运行得更像这样 while 循环

0 投票
4 回答
2648 浏览

postgresql - PostgreSQL 将数据从递归 CTE 传递到函数

我有以下问题:我正在尝试发现从源节点(node_s)到目标节点(node_t)的所有可能路径。

带有图边的原始表格的格式很简单:| 节点_x | 节点_y | 实力 | ,其中“node_x”->“node_y”是直接边,边的强度为“权重”。

这个想法是,如果在探索路径期间的任何时候,我们发现其子节点中的一个节点具有目标node_t,我们记录该路径并停止从该节点探索路径,否则继续探索。

简单的解决方案是使用 PostgreSQL 的递归 CTE,它构造图的传递闭包:

上面的代码将从源节点node_s发现所有可能的路径。只有在传递闭包构造之后,我才能选择从源节点到目标节点的所需路径行(参见最后一个 SELECT 语句)。

例子:

best_path 表有以下数据:

询问:

找到从源节点 = 1 到目标节点 = 4 的路径

结果:

这不是我需要的。由于已经有从节点 2 到节点 4(目标)的直接边,我不需要路径 1.2.5.、1.2.4.8.、1.2.4.9.、1.2.5.10.、1.2.5.11.,路径探索对于节点 2,应该在发现从 2 到 4 的路径时停止。

总而言之,如果节点已经具有到目标节点的直接边缘,我不想发现节点的路径。这意味着在 CTE 的递归术语中,我希望有一些条件可以说明以下内容,伪代码如下:

作为查找从源节点 = 1 到目标节点 = 4 的路径的查询的结果,我想要以下内容:

在此先感谢您的帮助!

我已经尝试了很多方法:例如 FROM/WHERE 子句中的条件,尝试将 CTE 传递给函数,但没有成功。

任何建议将不胜感激。

我有自己的递归函数,可以实现我想要的,但是,在大量数据上它非常慢;而且 PostgreSQL 的 CTE 显然优化得很好,所以我想深入研究一下。

0 投票
1 回答
162 浏览

sql-server-2008 - 无法使用递归 CTE 找到匹配的子记录

我有下表@t:

如果我通过 ParentId = P1,则所需的输出是 x3

即停止条件是匹配记录的最后一行并获取该记录的 sku 名称

排。如果没有匹配的行,则返回 null

我的尝试(虽然没有工作)

请帮忙

0 投票
1 回答
176 浏览

sql - 使用 WITH RECURSIVE 查找所有复合类型组件类型

给定typname复合类型,如何递归oids查找所有组件类型的类型?

例子:

我可以得到oids成员的类型t_employee

但我需要递归,我想这可以使用WITH RECURSIVE

但这并没有找到t_station复合类型的内部数组。

0 投票
1 回答
269 浏览

sql - 将脚本从 MSSQL 转换为 PL/pgSQL

我刚开始使用 EVE 静态转储,它只是很多包含游戏数据的表格,例如太阳能系统连接的列表,这就是我正在处理的内容。我想制作一个网页,让您过滤掉系统,第一步是获取附近系统的列表,以及到它们的距离。

我找到了一个用于 MSSQL 的脚本

我知道我可能只使用 MSSQL 版本的转储,但我也想更多地了解如何更好地使用 PostgreSQL。

我了解它在做什么以及一切,但我对 PL/pgSQL 的理解还不够好,无法使其正常工作。

我的尝试是

产生的错误是

感谢所有的帮助。

0 投票
1 回答
3334 浏览

sql - 递归查询中的数值溢出:Teradata

我是 teradata 的新手。我想将数字 1 到 1000 插入到test_seq创建如下的表中。

在这个网站上搜索后,我想出了 recursive 查询来插入数字。

test_dual如下创建,它只包含一个值。(类似于 Oracle 中的 DUAL)

但是,当我运行插入语句时,我得到了错误,Failure 2616 Numeric overflow occurred during computation.

我在这里做错了什么?integer数据类型不足以容纳数值 1000 吗?另外,有没有办法编写查询,以便我可以取消test_dual表格?

0 投票
3 回答
670 浏览

sql - 使用 cte 获取给定所有祖先节点属性的完整路径的最后一个节点

给定以下 PostgreSQL 表:

目前我手动构建 sql 查询,为每个路径元素进行连接。但这对我来说似乎很丑陋,当然它限制了可能的深度。

例子:

我想知道是否有更好的方法,可能使用 CTE?

您可以看到我当前的代码是如何工作的以及预期的输出是什么:http:
//sqlfiddle.com/# !1/4537c/2