小编典典

存在循环引用的递归CTE

sql

我在SQL Server数据库中具有分层结构。我正在尝试编写查询以获取给定元素下结构中的所有元素。

因此,给定具有ID和parent_id列的数据库表,这就是我要做的:

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。有没有办法做到这一点?


阅读 177

收藏
2021-03-17

共1个答案

小编典典

您需要将WHERE过滤器放在查询的CTE部分中,如下所示:

WITH recursive_cte (root_id, id) AS (
  SELECT parent_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
2021-03-17