sql – 存在循环引用时的递归CTE
发布时间:2020-05-24 17:26:44 所属栏目:MsSql 来源:互联网
导读:我在SQL Server数据库中有一个层次结构.我正在尝试编写一个查询来获取给定元素下结构中的所有元素. 因此,给定一个包含列id和parent_id的DB表,这就是我所做的: WITH recursive_cte (root_id, id) AS ( SELECT parent_id, id FROM test_cte UNION ALL SELECT t
|
我在SQL Server数据库中有一个层次结构.我正在尝试编写一个查询来获取给定元素下结构中的所有元素. 因此,给定一个包含列id和parent_id的DB表,这就是我所做的: WITH recursive_cte (root_id,id) AS ( SELECT parent_id,id FROM test_cte UNION ALL SELECT t.parent_id,r.id FROM test_cte t INNER JOIN recursive_cte r ON (r.root_id=t.id) ) SELECT * FROM recursive_cte WHERE root_id=0 现在,如果在id = 0的元素下的结构中存在循环引用,则从DBMS获得错误(在语句完成之前,最大递归100已用尽).这很好,循环引用的存在已经是一个错误. 但是如果我在另一个元素下的结构中有一个循环引用,查询将始终给出错误.即使我指定了将记录集限制为非循环记录的条件(例如WHERE root_id = 0). 例如: id|parent_id|name | --+---------+---------------+ 0 |NULL |TEST A | 1 |4 |TEST CIRCULAR | 2 |0 |TEST B | 3 |2 |TEST C | 4 |1 |TEST CIRCULAR B| 我想让我的查询在没有错误的情况下工作,条件为root_id = 0.有没有办法做到这一点? 解决方法您需要将WHERE过滤器放在查询的CTE部分,如下所示:WITH recursive_cte (root_id,id FROM test_cte WHERE id=0 -- Restrict your recursion to start from the item with id = 0,instead of considdering all items. UNION ALL SELECT t.parent_id,r.id FROM test_cte t INNER JOIN recursive_cte r ON (r.root_id=t.id) ) SELECT * FROM recursive_cte (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server-2008 – 在2008年的SQL Server 2012,脚本和使用
- sql-server – 强制实施数据库完整性
- 使用MySQL Slow Log来解决MySQL CPU占用高的问题
- SQL Server SQL 导入导出Excel数据的语句
- sql-server-2005 – 返回两个输出参数sp_executesql
- sql – ‘DATE’不是公认的内置函数名
- MySQL数据备份之mysqldump的使用详解
- sql-server – 无法使用SQL Server管理控制台连接到远程SQL
- sql server中Select count(*)和Count(1)的区别和执行方式
- 在MySQL中使用JOIN语句进行连接操作的详细教程
