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,直到没有更多的行添加到结果集中。
所以;
- 您不需要第三条 SELECT 语句。第二个应该抓住一切。
- 如果你有循环(例如,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;
我正在尝试构建一个查询,以使用 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,直到没有更多的行添加到结果集中。
所以;
- 您不需要第三条 SELECT 语句。第二个应该抓住一切。
- 如果你有循环(例如,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;