问题标签 [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 回答
1577 浏览

tsql - 在 SQL Server 2012 中的多级层次结构查询中按特定顺序对子项进行排序

我在 SQL Server 2012 中有一个名为的表,其中包含通过列Items在父子关系中相互关联的不同项目。ParentId该表包含一个 ItemId 为 429965 的最顶层项目及其子、孙、曾孙等,即它包含最顶层项目的多级层次结构。

我尝试过的示例数据和查询的情况演示在SQL Fiddle of this question。的计算列Position告诉层次项目的显示顺序。

我正在尝试获取最顶层项目的完整层次结构,以便满足以下requirements要求:

  1. 在此多级层次结构中,父项紧随其后的是其子项
  2. 子项需要以 的升序显示在此层次结构中CreateDate

我尝试过的查询达到了要求#1,但没有达到要求#2。

问题

除了使用现有递归查询的要求 #1 之外,我如何实现要求 #2?我不能简单地按 PathStr 和 CreateDate 排序,因为在我的多级层次结构中没有两条路径是相同的。

架构和示例数据创建查询

我试过的查询

在上面的查询中,具有Position2 和 24 的项目按 CreateDate 的降序出现,并且都是同一父项的子项目。如果排序正确,那么位置 24 的项目实际上应该有一个位置 2,而位置 2 的项目应该有一个 24 的位置。

0 投票
1 回答
1937 浏览

algorithm - Postgres有向图上下遍历

我有一个问题,我可以解决小型数据集,但在具有(可能)不干净数据的大型数据集上失败。

该数据库是 PostgreSQL 中非循环(希望)图的实现。三张桌子

我有一组user_ids从中派生element_associations和图中的起始vertex_element,并且我想找到所有子节点都可以从具有user_ids之一的element_association访问。如果节点或其祖先之一是element_association的候选object_id之一,则认为该节点是可访问的。

该图在形状上是相对三角形的(根节点少,叶节点多),从一个起始顶点元素开始,我的策略如下:

  1. 根据候选element_associations列表检查当前的vertext_element;如果好,所有后代都可以访问,否则去...
  2. 检查当前vertex_element的祖先是否在候选element_associations列表中。与 (1) 类似,如果命中,则所有祖先都可访问,否则转到...
  3. 遍历每个子vertex_element(广度优先搜索)并执行步骤 1 和 2。

当我想避免仔细检查相同的祖先vertex_elements时,就会出现问题。主要查询是向下遍历,用一组候选element_associations检查每个后代的可访问性

但是,还有一个附加递归子查询,它检查LEFT OUTER JOIN element_associations 中的每个 vertex_element,看起来像

这样做的问题是子查询倾向于避免遍历同一个父顶点两次。但是,不能保证当我们通过后代遍历图时,我们不会重读先前评估的祖先。对于小数据集,这很好,性能还可以;然而,它是可笑的不可扩展的,并且对周期极不适应。

我需要做的是保留关于我已经在子查询之间遍历的父顶点元素的信息,以避免重读步骤;但是,我被困在如何在单个查询中执行此操作。

0 投票
2 回答
263 浏览

sql - 递归 CTE 而不是标量函数

我们有从 Microsoft Dynamics AX 加载的数据仓库和多维数据集问题是由标量函数引起的:

函数被调用:

表定义:

整个加载机制在 3 分钟内完成,除了这部分。从这部分开始需要30多分钟。我需要用一些递归 CTE 来改变这个函数。有什么建议吗?

0 投票
0 回答
368 浏览

mysql - 如何忽略 MySQL 工作台中的语法错误?

我在 MySQL 工作台 6.3.10-4 中创建了一个 EER 图。现在我需要添加一个使用 MariaDB 10.2.2 功能(也已在 MySQL 8.0 中发布)的存储过程,即递归 CTE。但是,MySQL 工作台的语法检查器只支持到 MySQL 5.7。由于这个原因,我的存储过程在 EER 图中被命名为“procedureName_SYNTAX_ERROR”,并且不包含在正向工程中。

有没有办法忽略这样的语法错误,或者有什么其他方法可以在导出中包含这个存储过程?我无法在每次导出时手动包含它(由于我和其他开发人员每天都会进行许多导出)。

0 投票
1 回答
186 浏览

sql - 递归查询“CTE”的“ColumnName”列中的锚点和递归部分的类型不匹配

试图将多行连接复制到一个字符串中--> https://www.red-gate.com/simple-talk/sql/t-sql-programming/concatenating-row-values-in-transact-sql/#目录205129485

这是查询:

消息 240,级别 16,状态 1,行 1 类型在递归查询“CTE”的“CodeList”列中的锚点和递归部分之间不匹配。

我知道这是一个经常被问到的问题,但我无法从我得到错误的地方得到。经过测试,我发现它是在我在问号之间添加一段代码时出现的。它已被铸造,但它仍然给出一个错误

0 投票
2 回答
638 浏览

sql - SQL Server CTE 循环;将所有记录一起插入

我有这种情况:

当我运行它时,它会选择一切正常(103 条记录)。

问题是当我将此代码插入#t2(13条记录!!!)

我认为 SQL 是逐步运行并在运行期间插入记录,而我在 tmp1 中的条件已经结束......

如何解决?

我的目标是检查数据是否存在,而不是循环并插入结果......但 SQL 在第一个循环后停止......

0 投票
1 回答
794 浏览

postgresql - 递归 JSONB postgres

我正在尝试在 Postgres 中构建一个同时支持数组和对象的递归 CTE,以返回键值对列表,但似乎无法找到一个好的示例。这是我当前的代码。

正如你所看到的,只要我点击一个数组而不是一个对象,代码就会停止递归。我尝试过使用 case 语句并将函数调用放在 case 语句中的 jsonb_each 或 jsonb_array_element 但我收到一个错误,告诉我改用横向连接。

0 投票
2 回答
372 浏览

sql-server - SQL Server 中的多对多到递归 CTE

据我了解,如果您将一个部分定义为父级,另一个定义为子级,则任何多对多关系都是一种层次结构。

我有一种情况,我需要在多对多表中获取映射到自身的对象的子对象,但是我很难为它编写递归 CTE。

例如,假设我有:

对于根级别,我使用的规则是它是一个根对象,如果它的 ID 不在第二列 (ChildId) 中,但这是有问题的,因为从上面的示例可以看出,我可以有多个记录根(ID:2)

对于递归部分,无论我尝试什么,要么得到无限递归,要么递归根本不起作用。

所以我完全被卡住了。

更新 只是添加更多说明。我正在构建一个存储过程,该过程在 parentId 中传递,并且内部具有递归 CTE。我想要得到的输出是,对于传入 2 的 parentId,使用上面的示例,我想:

这是我的一些代码:

0 投票
0 回答
119 浏览

sql - 使用 CTE 创建数据子集

我想创建一个用于测试目的的数据子集,我从一个用户表开始,选择 a 类型的 X、b 类型的 Y、c 类型的 Z(等等),然后创建一个包含这些的新表用户。然后我需要创建所有相关表(带有必要的记录),然后创建所有相关表...

我相当确定最好的方法是递归公用表表达式,但是我对这些没有太多经验,希望有人能帮助我。到目前为止,我有以下内容,但注意到两件事:

  1. 2 级似乎包含了 1 级中的所有内容,除了我期望的新记录
  2. 这实际上并没有创建/插入记录(我仍然需要帮助)

    /li>

谢谢您的帮助!

0 投票
0 回答
94 浏览

sql-server - 跨多对多表的递归 CTE

我正在使用递归 CTE 来跟踪数据库中的所有关系,使用外键来创建一些测试数据。一切都运行良好,直到我找到一个包含多对多关系的表。我已经查看了与多对多表相关的其他一些答案,但它只是没有点击我 - 有人可以看看我所拥有的并帮助我指出正确的方向吗?具体来说,我正在从客户端到达一个预算/客户表(id、budgetid、clientid)的表。此时递归停止;我希望/期望它遍历预算表(通过budgetid)并在此之后继续访问任何相关表。

现有代码(当前尝试)如下:

示例数据如下。DML 对于这个问题不是必需的,但提供是彻底的。

当前返回除“类型”列之外的白/绿线。绿线是多对多表,红线也是我想要返回的(与绿色“BudgetClient”表相关的另一个“一对多”)。本质上,递归是使用外键来跟踪表关系。所以在这里,顶部/锚点表是用户,它有两个子表——客户和公司,都是一对多的关系。反过来,Client 有一个相关表 BudgetClient,它与 BudgetClient 具有多对多关系 - BudgetClient 将 Client 和 Budget 联系在一起。

需要明确的是,我想要的结果是将返回下图中的所有行。

在此处输入图像描述