加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 存在循环引用时的递归CTE

发布时间:2020-12-12 06:22:36 所属栏目: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.p
我在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读