Questions tagged «recursive»

使用递归来解决数据库问题。


4
SQL递归实际上如何工作?
来自其他编程语言的SQL,递归查询的结构看起来很奇怪。一步一步地走,它似乎崩溃了。 考虑以下简单示例: CREATE TABLE #NUMS (N BIGINT); INSERT INTO #NUMS VALUES (3), (5), (7); WITH R AS ( SELECT N FROM #NUMS UNION ALL SELECT N*N AS N FROM R WHERE N*N < 10000000 ) SELECT N FROM R ORDER BY N; 让我们来看一看。 首先,执行锚成员并将结果集放入R。因此R初始化为{3,5,7}。 然后,执行降到UNION ALL以下,并且第一次执行递归成员。它在R上执行(即在我们当前拥有的R上:{3,5,7})。结果为{9,25,49}。 这个新结果如何处理?是否将{9,25,49}附加到现有的{3,5,7}上,标记结果并集R,然后从那里进行递归?还是将R重新定义为仅此新结果{9,25,49},然后再进行所有合并? 两种选择都没有道理。 如果R现在为{3,5,7,9,25,49}并且执行递归的下一个迭代,那么我们将以{9,25,49,81,625,2401}结束,并且失去了{3,5,7}。 如果现在R仅是{9,25,49},则存在标签错误的问题。R被理解为锚定成员结果集与所有后续递归成员结果集的并集。而{9,25,49}只是R的一个组成部分。到目前为止,我们还没有获得R的全部。因此,将递归成员写为从R中选择是没有意义的。 …

5
如何在行之间递归查找90天过去的间隔
在我的C#家庭世界中,这是一项微不足道的任务,但是我还没有在SQL中实现它,而是希望解决基于集合的问题(没有游标)。结果集应来自这样的查询。 SELECT SomeId, MyDate, dbo.udfLastHitRecursive(param1, param2, MyDate) as 'Qualifying' FROM T 应该如何运作 我将这三个参数发送到UDF中。 UDF在内部使用参数从视图中获取相关的<= 90天的旧行。 UDF遍历“ MyDate”并返回1(如果应将其包括在总计计算中)。 如果不应该,则返回0。此处命名为“ qualifying”。 udf会做什么 按日期顺序列出行。计算行之间的天数。结果集中的第一行默认为Hit =1。如果差异最大为90,则-传递到下一行,直到间隔总和为90天(必须经过90天)。达到时,将Hit设置为1并将间隙重置为0代替从结果中删除行也将起作用。 |(column by udf, which not work yet) Date Calc_date MaxDiff | Qualifying 2014-01-01 11:00 2014-01-01 0 | 1 2014-01-03 10:00 2014-01-01 2 | 0 2014-01-04 09:30 2014-01-03 1 …

2
递归CTE为所有子代查找总计
这是我要使用递归T-SQL查询(大概是CTE)与以下预期结果进行搜索的程序集树。我想知道给定零件的每个组件的总数。 这意味着如果我搜索“铆钉”,我想知道装配体中每个级别的总数量,而不仅仅是直接子数量。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 目前,我可以得到直系父母,但想知道如何扩展我的CTE,以使我可以将此信息向上滚动。 With …

2
PostgreSQL递归后代深度
我需要根据祖先计算后代的深度。当记录具有时object_id = parent_id = ancestor_id,它将被视为根节点(祖先)。我一直在尝试使WITH RECURSIVE查询与PostgreSQL 9.4一起运行。 我不控制数据或列。数据和表架构来自外部来源。桌子在不断增长。目前每天约有3万条记录。树中的任何节点都可能丢失,并且它们有时会从外部源中拉出。通常按created_at DESC顺序提取它们,但是使用异步后台作业提取数据。 最初,我们有一个解决此问题的代码,但现在有5M +行,需要近30分钟才能完成。 表定义和测试数据示例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) …

1
如何从SQL Server审核数据中筛选出标量值用户定义的函数用法?
我们有一个SQL Server数据库,该数据库具有数据库审核规范,该规范审核数据库上所有执行的操作。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 我们发现,某些查询将对结果集中的每一行使用标量函数写入审核日志。当发生这种情况时,在将日志ETL放入最终的静止位置之前,日志已填满,并且日志记录中存在空白。 不幸的是,由于合规性原因,我们不能简单地停止审核每条EXECUTE声明。 解决此问题的方法首先想到的是使用WHERE“ 服务器审核”上的子句来过滤活动。代码如下所示: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 不幸的是,SQL Server不允许使用关系IN运算符(可能是因为它不想在每次必须写入审核日志时都进行查询)。 我们想避免编写一个存储过程,其硬代码object_id中WHERE条款,但是这是我们在解决这个问题的最好办法目前的想法。我们是否应该考虑替代方法? 我们注意到,当在递归CTE中使用标量函数时,它将导致查询将查询写入结果集中的每一行。 供应商提供了一些标量值函数,我们无法删除或移动到备用数据库。

1
如何以扩展的树状方式对递归查询的结果进行排序?
假设您有一个nodes这样的表: CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); 它代表一个标准的类节点树结构,其中根节点在顶部,几个子节点与根节点或其他子节点悬挂在一起。 让我们插入几个示例值: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); 现在,我要检索前10个根节点及其所有子节点,深度为4: WITH RECURSIVE …

3
更改maxrecursion的系统范围默认值
如何更改系统范围的默认值MAXRECURSION? 默认情况下为100,但是我需要将其增加到1000。 我无法使用查询提示,因为我使用的程序会接受我的查询并为我执行查询,但是不幸的是,我无法解决此限制。 但是,我确实对服务器实例具有管理员权限。我在服务器方面进行了摸索,但没有看到与查询选项或递归相关的任何信息。我假设有有是一个某处在那里我可以更新系统范围内的默认。 有任何想法吗?

2
概念性ERD多表多对多,还是可能递归?
我正在创建一个概念图[是的,我知道我已经包括了属性和键-但这只是为了巩固我在学习时正在做的事情] –因此,请把它视为概念图,重点放在关系和表而不是如何绘制;) 我的想法障碍是: 我正在尝试确定对个人档案,位置和组织关系进行建模的最佳方法。 首先,规则: 一个或多个个人资料可以是一个或多个组织的成员/朋友;反之亦然。 一个或多个个人资料可以是其他个人资料的成员/朋友。 一个或多个组织可以是其他组织的成员/朋友。 朋友和会员的不同之处在于,朋友就像只读的,而会员(取决于级别)具有完全的修改权限。 为了进一步使事情复杂化,场所具有自己的一组“更进一步”的可完善规则,例如,一个组织拥有两个场所,但是根据场所规则,该组织的成员[ 个人资料 ]可能在一个场所具有完全访问权限,但在该场所具有受限访问权限其他。[抱歉:您可能必须在另一个窗口中打开图像才能获得更好的查看尺寸。] 因此,正如您所看到的,“个人档案”和“组织”的概念几乎相同,而“ Friends and Members” [...]这个尚未建模的概念[...我想它将像设置Owner /的当前中介表一样处理记录中的管理员/成员/朋友等]。因此,为什么我要考虑以下概念: 请参见上图中的Option.2:它将删除当前的Organization和Organization_Locations表及其关系,将其替换为Option.2 Organization Table作为与Profile的某种递归关系。 我想问题的症结在于我是否在编程方面对多态性过于介意,以至于损害了其简单性和灵活性,使自己在整个过程中陷入混乱;) 谢谢您的提前考虑,非常感谢-M :)。 修改后的图: 针对MDCCL的问题: 是的,Profile是由一个Person组成的,并且具有相同的含义-尽管您的理论依据是-我相信您是正确的:Organization和Person可以是Profile的子类型;因此,概要由一个人或一个组织组成。 每个配置文件一个电子邮件地址。 是。如上所述,组织的至少应具有一个电子邮件地址。 正确,一个固定地址。 这是一种可能性,但是很罕见-尽管从我的经验中学到了-因此应该为将来的寿命等建模,并且为了确认,一个位置因此可以由多个人拥有。 位置绝对是大多数其他位置之间不可或缺的实体。也许我会在这里澄清一下可以做什么,然后让您阅读我的其他答案,希望这些答案可以先对该问题进行有益的补充[ 然后再查看我对#6的答案 ];)Re:角色所有者。 An **Organization** can be an Owner of zero or more **Locations**. A Person can be an …

2
为什么带有参数的此递归CTE在处理文字时不使用索引?
我在树结构上使用递归CTE来列出树中特定节点的所有后代。如果我在WHERE子句中写入文字节点值,则SQL Server似乎实际上仅将CTE应用于该值,从而给出了具有较少实际行数的查询计划,等等: 但是,如果我将值作为参数传递,它似乎实现了(假脱机)CTE,然后在事实之后对其进行过滤: 我可能看错了计划。我还没有注意到性能问题,但是我担心CTE的实现会导致更大数据集的问题,尤其是在繁忙的系统中。另外,我通常会自己遍历此遍历:我遍历祖先,然后遍历到后代(以确保收集所有相关节点)。由于我的数据如何,每组“相关”节点都非常小,因此实现CTE没有任何意义。当SQL Server似乎意识到CTE时,它给我的“实际”数量带来了相当大的数目。 有没有办法让查询的参数化版本像文字版本一样工作?我想将CTE放在可重用的视图中。 用文字查询: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

2
查找以编程方式联接表所需的所有联接
给定一个SourceTable和TargetTable,我想以编程方式创建一个具有所有所需联接的字符串。 简而言之,我试图找到一种创建这样的字符串的方法: FROM SourceTable t JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn 我有一个查询,该查询返回给定表的所有外键,但是在尝试以递归方式遍历所有这些以找到最佳联接路径并制成字符串时遇到了局限性。 SELECT p.name AS ParentTable ,pc.name AS ParentColumn ,r.name AS ChildTable ,rc.name AS ChildColumn FROM sys.foreign_key_columns fk JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id JOIN sys.columns rc …

1
递归CTE性能
需要递归CTE性能方面的帮助。低于CTE的速度非常慢,因为它试图以回溯方式提取分层数据。表很大,每个根ID最多具有3个递归itemid。可能有大约200000或更多根ID。我知道对于大型数据集,递归CTE的速度很慢,因为锚中的每个rootid都会递归itemid。 架构: Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime) 上表有超过一百万行。 CTE查询: ; With rootcte as ( select itemid from RootItem where rootid is null union all select r.itemid as RootId , i.itemid from RootItem i join rootcte r on i.rootid = r.itemid ) 我们无法修改表架构并使用继承权。我也尝试了while循环,但是那也很慢。 还有什么其他方法可以优化此查询? …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.