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

sql-server - 递归 cte 以识别数据中的循环引用

我正在尝试识别我需要递归 cte 的数据中的递归/循环引用。

例如,我有一个包含Product_IDand的表Inner_Product_ID。当 Product_ID A 在 Product_ID B 内部时,我想要结果,它在 Product_ID C 内部,在 Product_ID A 内部。

样本数据

预期产出

我已尝试使用 cte 进行基本查询,但不确定如何针对此问题实现递归 cte:

0 投票
1 回答
146 浏览

sql - 锚点和递归之间的类型不匹配

我有递归日期的sql查询错误问题

递归查询“日期”的“日历日期”列中的锚点和递归部分之间的类型不匹配。

这个查询已经在存储过程中执行了但是我们有这个代码的问题将在 c# 代码中合并我得到上面提到的错误

0 投票
5 回答
173 浏览

sql - 在列中的两个值之间重复值

我正在尝试重复列中的第一个特定非空值,直到同一列中的下一个特定非空值。我怎么做?

数据如下所示:

它应该是这样的:

我调查了一下LAG()LEAD()但我一直认为我必须使用 a CURSOR。我只知道这些,但还没有在这种情况下使用它们。

0 投票
1 回答
82 浏览

postgresql - 反向 SELECT 查询结果

我有递归查询,它从分层模型返回一些行。有点儿:

如何反转 SELECT 查询的结果?

PS:我不能按 ID 订购,父母的 id 可以或多或少然后在孩子。

0 投票
1 回答
308 浏览

sql-server-2012 - 如何诊断缓慢/不一致的 SQL Server 查询?

运行 Windows Server 2012、Hyper-V、SQL Server 2012 主动/被动故障转移集群,带两个 8 处理器、60GB 节点、单实例、300 个数据库。此查询产生不一致的结果,运行时间在 10 到 30 秒之间。

替换LEFT JOIN AddressesJOIN Addresses

或将所选列的长度减少Addresses到小于 100 字节

将执行时间减少到大约 0.5 秒。

此外,使用SELECT DISTINCT和加入books.EntitiesVendors

将时间减少到大约 0.75 秒。

概括

这些情况表明 SQL Server 实例中存在某种资源限制,导致这些不稳定的结果,我不知道如何诊断它。如果我将有问题的数据库复制到运行 SQL Server 2012 的笔记本电脑上,则不会出现问题。我可以继续更改 SQL 并希望获得最好的结果,但我更愿意找到更明确的解决方案。

任何建议表示赞赏。

2018 年 2 月 27 日更新

未修改查询的执行计划将针对地址表的聚集索引查找显示为问题。 聚集索引查找地址表

将选择的列的长度减少Addresses到小于 100 字节

将 Clustered Index Seek 替换为 Clustered Index Scan 以检索a.Fax和 Hash Match 以将此值加入结果。

哈希匹配

Addresses主键创建如下:

该索引每天都会根据需要进行碎片整理和优化。

到目前为止,我找不到任何有用的信息来解释为什么 Clustered Index Seek 会为查询增加这么多时间。

0 投票
1 回答
95 浏览

row-number - 使用前几行 row_number 值计算位置变化

我正在尝试根据前几行ROW_NUMBER()与当前行相比计算位置变化ROW_NUMBER()

我的查询使用带有 ROW_NUMBER() OVER .. 子句的递归 cte,该子句巧妙地为我提供了按年份划分的结果行号。

在此之后,我的查询然后比较位置以计算行号之间的变化。

不幸的是,这不起作用,因为 [after] 位置始终为空。

这有点难以解释,所以我提供了一个 sqlfiddle 链接:http ://www.sqlfiddle.com/#!18/c7e57e/1

--

这张图片直观地解释了我想要实现的目标 我设想的输出

2011 年明尼苏达排名第 1,2012 年明尼苏达排名第 3,变化为 +2

2011 年爱荷华州排名第 6,2012 年爱荷华州排名第 4,变化为 -2

2011 年南达科他州排名第 5,2012 年南达科他州排名第 5,变化为 0

谢谢

0 投票
1 回答
282 浏览

sql-server - 如何使用递归 CTE 从 00 到 23 获取时间?

如何使用递归 CTE 从 00 小时到 23 小时获得一天的小时数?

它给出了 00 到 24 小时,但我需要在我的结果集中排除 24 小时,或者换句话说,我最多只需要 00 到 23 小时

我的代码:

它给出了 00 到 24 小时,但我需要在我的结果集中排除 24 小时,或者换句话说,我最多只需要 00 到 23 小时

实际结果:

预期结果:

0 投票
0 回答
234 浏览

sql - 有没有比 LIKE 更快的方法来 RECURSIVELY 加入 SQL-Server,没有循环?

我需要递归地加入一个可以有循环的大图。
现在,在 SQL-Server 中的简化版本如下所示:

由于 SQL-Server 不支持数组,我尝试使用 JSON 进行优化:

但 JSON 并没有更快,而且它只适用于 SQL-Server 2016+。

我也尝试过使用 XML:

虽然这适用于 sql-server < 2016,但这太慢了 - 比喜欢的要糟糕得多。

获得良好性能的唯一方法是切换到支持数组的 PostgreSQL:

这在 1.6 秒内完成,这与我预期的一样好。

有什么方法可以提高 SQL-Server 的性能吗?

注意:
这个愚蠢的例子CTE.i IN (whatever)不应该有任何意义,它只是为了速度比较。

0 投票
1 回答
91 浏览

tsql - 如何创建参数化递归 CTE 以展平标量函数中的层次结构?

我正在尝试创建一个标量函数来确定提供 ID 的用户或其任何下属是否在提供的订单 ID 集合下有订单。

注意我正在使用我自己的用户定义表类型IntegerIdTableType来获取 OrderIds 的集合。

这是我的OrdersUsers表的一些示例数据。

用户

用户样本数据

订单

订单样本数据

预期成绩

DoOrdersExistUnderUserOrUsersSubordinates使用以下值调用时,我期望得到以下结果。

预期订单

我在使用此功能时遇到了 2 个问题:

  1. 语法错误:

    关键字“WITH”附近的语法不正确。

    ')' 附近的语法不正确。

  2. “GetUserIds”不是可识别的内置函数名称

    即使没有包装在函数中,上述情况似乎也会发生。

我不知道将参数传递给递归 CTE 的正确方法是什么,但我已经看到 CTE 的声明在括号中有一个名称的示例,我认为它是一个参数

我尝试在分号之前立即放置一个分号,WITH即使它是函数中唯一的语句,我只是在';'附近得到不正确的语法。而不是关键字“WITH”附近的语法不正确。

我也试过去掉BEGINand END,这给了我在'RETURN'附近的不正确语法。, 加上关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前面的语句必须以分号结束。如果我不包括多余的分号。

我该如何解决这一切?

当然,递归 CTE 必须能够接受一个参数,或者他们会递归什么?

更新:

在与Zohar_Peled 链接的文档的示例 F进行斗争之后,我最终发现参数并没有像这样传递到 CTE 中,而是加入到 CTE 中,然后通过其声明的括号保留在其中。然后在相应SELECT的 s 中定义的任何内容都通过参数输出到称为 CTE 的任何内容(在这种情况下,外部SELECT Id FROM UserNodes语句或 CTE 本身(用于递归))。

我将函数内的 SQL 语句更改为以下内容,它在函数外按预期工作。

这单独工作很好(提供了所需的变量来替换缺少的函数参数),但是一旦我将它放回CREATE FUNCTION块中,我就会面临与以前相同的语法错误(不包括 2.)。

0 投票
3 回答
85 浏览

sql-server - 如何使用递归 CTE 为数据集添加分辨率

我正在尝试创建一个递归 CTE 语句,该语句在数据点之间添加空白行,稍后将用于插值。我是 SQL 的初学者,这是我第一次使用 CTE,我很难找到正确的方法来做到这一点。

经过一些研究后,我尝试对下面提供的代码进行一些不同的细微修改,但还没有很好地理解我的问题。以下代码应通过每 4 小时从样本数据集中进行一次观察来模拟稀疏采样,第二部分应每 0.1 小时添加具有相应 x 值的行,稍后将填充从三次样条曲线派生的插值。

- 样本数据

--1

--2

第一个 CTE 按预期工作并产生 12 个列表(两天每 4 小时一个样本),但第二个产生语法错误。预期的输出将类似于