我在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)。
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。有没有办法做到这一点?
root_id=0
您需要将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