问题标签 [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 投票
1 回答
192 浏览

sql-server - 父 ID 不在列表中时的递归 CTE

我有以下嵌套集

在此处输入图像描述

这导致了这棵树

我有一个产品列表 SELECT Id, Name ... FROM Products

与类别的多对多关系。所有类别都可以有促销。好的,现在的问题。

假设我在类别 7、8、6 中有一个 ProductX。以及类别 1、2、3 中的促销活动。我需要找到最近的父母,每个类别都有促销活动,或者直到没有更多父母为止。

最终结果应该是

我有的

然后获得 Better Promotion(我知道该怎么做)并应用于主查询 SELECT * FROM Products; 对于每个产品(所以只是一个简单的连接)。

我的问题是我知道我需要使用(或者我认为我需要使用)递归 CTE,但我不知道该怎么做。因为它应该只对每一行递归,并且只在它找到该行的提升之前。

编辑(我将尝试解释逻辑)。

此产品有 2 个直系父母:4(来自 7 和 8)和 3(来自 6)我在 CategoryIds 中有促销:1、2、3。第一轮查询结果

重要的是 ParentId 所以我可以 GroupBy ParentId 结果将是

好的,因为promotionPrice 是NULL 我需要去他的父母(在这种情况下2)所以上面的查询需要返回

由于 PromotionPrice 是 Null 我必须检查 Category2 是否有 Promotion 所以结果将是

它停在那里。如果我从 Category2 中删除了促销,它应该再进行一轮:

在这一点上,由于没有更多的父母,PromotionPrice 是否为空都没有关系。问题是我需要一直努力寻找升职。

当我查看 SortPath 已经拥有所有信息时,只需将其分解并递归地倒退直到找到具有促销的 ID,但我仍然不知道如何实现这一点。

希望这有助于解释一下。

0 投票
2 回答
155 浏览

sql - 在 SQL 中使用内连接的递归 CTE

我必须制作一个递归 CTE 以将所有知道 kevin bacon 的演员还给我,以便更好地了解我的数据库一个只通过两个演员了解培根的人 例如,您可能想知道阿尔弗雷德希区柯克如何与凯文培根联系起来。一个答案是:阿尔弗雷德·希区柯克和奥森·威尔斯一起在演艺界(1943),奥森·威尔斯和杰克·尼科尔森在一个安全的地方(1971),杰克·尼科尔森和凯文·培根在几个好男人(1992) !我正在尝试两种不同的方法,一种是给我一个空集,另一种是给我这个错误消息'递归通用表表达式 DBMASTER 的完整选择。培根”

0 投票
1 回答
220 浏览

postgresql - 在 PostgreSQL 触发器中循环和测试 cte 的结果

PostgreSQL 11.1

我正在使用以下触发器从 chart_gap 表中获取“新”图表编号:

我将如何添加测试以确保返回的 chart_number 不存在(在表患者中),如果存在,则强制循环以获取表中的下一个图表编号等,直到未使用的 chart_number找到了吗?也就是说,触发器必须返回新的和未使用的图表编号。

TIA

注意:我最初的想法是使用递归 cte,但认为直接循环可能更快?

0 投票
1 回答
106 浏览

sql - 在 SQL Server 中插入递归 CTE

我有一个跨两个字段具有父子记录关系的表。我编写了一个带有递归 cte 的查询,它将所有子记录返回到特定的记录。现在我需要将它们插入到另一个表中,在该表中使用 Recorded、ParentId 字段设置父子关系。RecordId 是标识符,主键。有什么方法可以在 CTE 中进行插入,以便在获取(和插入)子记录作为 ParentId 时可以使用标识符(RecordId)?

源表架构:

示例数据脚本:

我的递归 CTE 查询和结果:

我有“PN001”的所有子记录。我需要将它插入到其他表中。

目标表:

预期结果:

0 投票
3 回答
60 浏览

sql - 显示以每个字符串的第一个字母开头的所有值,由任何分隔符分隔

我有输入栏name

我希望输出包含两列

FirstLetter TotalsWordsWithThatLetter

我知道递归 CTE/stuff 函数会有所帮助。但无法编写完整的代码。

0 投票
1 回答
195 浏览

sql-server - 列出在包含级别作为 SQL Server 中的属性的透视表中每个级别中存在的特定节点的所有祖先或父节点

我有一个表“temp”,它的 id 及其直接父级的 id 作为列。表格如下:

临时表

节点的层次结构可以用上面的树结构表示。

现在,我想使用具有级别(如 Level1、Level2 等)作为其属性的递归 cte列出枢轴表中所有级别中存在的每个节点的所有祖先或父节点。为了得到这个输出,我计算了非透视表中的所有父节点,每个节点相对于其父节点的级别。其 sql 查询如下:

上述查询的输出如下所示:

cte 输出

但是,我想在特定节点的每个级别下旋转包含父 id 的递归 cte。比如说,对于 id=4,它应该在 Level3、Level2 和 Level1 下分别显示父 id 4、2 和 1。为此,我编写了以下查询:

但是,输出表不是所需的,因为它包含与特定节点的每个级别下的父 ID 重复的相同 ID,而是应该包含该节点在各个级别下的所有父级。执行上述查询后得到的输出如下所示:

主要输出

任何人都可以帮我解决这个问题......

0 投票
1 回答
105 浏览

sql - 用于生成分层数据的复杂递归 SQL

我正在尝试评估商店访客对 COVID-19 传播的影响。

这是一个简单的场景:

  1. 访客 A 走进商店并在时间 = 0 时遇到 Employee1。
  2. 然后,访客 A 在时间 = 1 处与员工 2 会面。
  3. 访客 B 走进商店并在时间 = 1 时遇到 Employee1。
  4. 然后,访客 B 在时间 = 2 处与员工 3 会面。
  5. 访客 A 离开商店。

当我收集所有访问者数据以及他们在一段时间内遇到的人时,数据集看起来像这样:

visitorByEmployee

我想根据这些数据构建一个层次结构,最终可以表示如下:

每棵树都代表了访客对病毒传播的影响:

我试图通过首先找到根节点(不受之前访问者和/或他们看到的员工影响的根访问者)来做到这一点。这些是 100 和 102。

#RootVisitors和开始#SeenOrder,我想建立一个表,它可以告诉我影响的层次结构,并可能导致如下结果:

这是可以使用递归 CTE 完成的吗?我试图这样做,但由于从访客到员工到访客到员工的层次结构不断变化,我很难创建递归 CTE。

更新 这是我正在研究的递归 CTE。它还不起作用,但我正在分享的方法是:

0 投票
0 回答
70 浏览

common-table-expression - PonyORM:使用 WITH RECURSIVE CTE 子句而不编写原始 SQL(递归查询)

是否可以用 PonyORM 的语法编写一个查询,该查询将被翻译成带有 WITH RECURSIVE CTE 子句的 SQL 查询?如果是,如何?

我知道我可以使用 select_by_sql() 和 select() 编写原始 SQL 查询,但我特别想知道是否必须使用原始 SQL 或者是否可以使用 PonyORM 的 Pythonic 语法来编写递归查询。

0 投票
1 回答
60 浏览

sql-server - 递归 CTE;列出所有父母/祖父母的所有底层后代

我看过一些类似问题的帖子,但解决方案对我不起作用,因为我不想让中层父母像孩子一样。我相当肯定这Recursive Common Table Expressions会成功。

基本上,我有一个表格列出了所有的父子关系,但它只有 1 级深。我想查询此表,以便对于所有父项,返回所有底层后代,以获得任意深度级别。例如:

我一直在尝试的查询比我看到的示例要复杂一些,因为我必须连接多个表才能使事情顺利进行。我必须将数据库 ID 与名称等连接起来。我还没有看到有人像这样只要求底层后代。

我正在处理一个食谱数据库,所以这些“父母”是食谱,而“孩子”是库存项目。但是库存项目可能是子配方;由其他库存项目甚至可能其他子配方组成。这就是这种任意深度的来源。我试图编写的查询是一个“购物清单”——所以对于每个存在的食谱(食谱或子食谱),我想列出所有它的底层库存项目(即没有子配方,只有它们的单个组件)。幸运的是,我的一张桌子有一列,其中有一点表明一种成分作为子配方的状态。

到目前为止,这是我正在使用的,但没有给出预期的结果:

RecpInv('rInv') 将父母与孩子相关联(项目 ID 与配方 ID)

Inv ('inv') 将项目 ID 与项目名称相关联

Recipe ('recipes')将配方 ID 与配方名称相关联

以下是部分查询结果。我从这个查询中得到 32,000 行:

这些是右侧食谱的正确顶级成分。左栏中以大写字母开头的项目是子配方,由库存项目和/或子配方组成。我不想要左边的任何子食谱。只是他们的底层组件。因此,“蒜泥蛋黄酱,烤大蒜”不应该将“烤大蒜泥”作为其成分之一。应该包括“烤大蒜泥”的底层组件。'大蒜,剁碎'也是如此。

我意识到这是一个很大的问题,但任何帮助表示赞赏。

0 投票
0 回答
93 浏览

sql - 在 Hive SQL 中按可变时间窗口对行号进行分区



这不是最容易解释的,所以我会尽力而为,但请询问您是否需要更多说明。
我正在使用 hive SQL,并且有一个包含用户和事件时间的表。我要计算的内容,如下面的 rownum 列所示,是一个在 4 小时窗口内按用户和事件时间划分的递增序列,在第一个包含值的 event_time 后 4 小时重置。

所以在下表中...

用户 A 的所有记录都在 00:01:00
- 04:00:00 之间 用户 B 有 3 个事件,在 00:01:00 - 04:01:00 的第一个窗口之间,并且从 04:08:00 - 08:08:00 在第二个窗口中
有 2 个事件 用户 C 在第一个 00:01:00 - 04:01:00 窗口中有 2 个事件,在第二个 04:10:00 有 1 个事件 - 08:10:00 窗口,以及 08:15:00 - 12:15:00 窗口中的 2 个事件

任何帮助/指针将不胜感激!