CTE SQL 查询中的多个递归联合全部选择

Multiple recursive union all selects in a CTE SQL query

我正在尝试构建一个查询,以使用 CTE 查询从 table 中搜索所有 parent 和 children 行。

我可以搜索 parent 和 return children 或搜索 children 和 return parent 但我可以不能在一个查询中处理两种可能性。

我只能完成 UNION ALL 查询之一。

我哪里错了?

declare @search nvarchar(50)

--set @search = '%Nucleus sub project%';
set @search = '%Nucleus test';

WITH Parent AS
(
    SELECT * 
    FROM tblProjects 
    WHERE ProjNo LIKE @search 
       OR ProjDes LIKE @search

    UNION ALL

    SELECT tblProjects.* 
    FROM tblProjects  
    JOIN Parent ON tblProjects.proID = Parent.ParentProjID

    UNION ALL

    SELECT tblProjects.* 
    FROM tblProjects  
    JOIN Parent ON tblProjects.ParentProjID = Parent.proID 
)
SELECT distinct * 
FROM Parent 
ORDER BY ParentProjID

我收到一个错误:

The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

递归调用 UNION ALL 之后的第二个select,直到没有更多的行添加到结果集中。

所以;

  1. 您不需要第三条 SELECT 语句。第二个应该抓住一切。
  2. 如果你有循环(例如,A 的父级是 B;B 的父级是 A)你将得到无限递归,并且 SQL 将在 100 次迭代后退出,给你最大递归错误。

检测周期比较复杂,但可以做到。

尝试使用两种不同的 CTE:

WITH x AS (
    SELECT p.*
    FROM tblProjects p
    WHERE  ProjNo LIKE @search OR ProjDes LIKE @search
   ),
   parents as (
    SELECT * 
    FROM x 
    UNION ALL
    SELECT p.* 
    FROM parents JOIN
         tblProjects p
         ON p.parentid= parents.proID
   ),
   children as (
    SELECT * 
    FROM x 
    UNION ALL
    SELECT p.* 
    FROM children JOIN
         tblProjects p
         ON children.parentid = p.proID
   )
SELECT distinct * 
FROM parents
UNION
SELECT distinct *
FROM children;