Sql 递归CTE…处理嵌套的父/子记录
我有以下记录: 我的目标是检查每位家长的子女总数,确保其为1%或100% 在上面的示例中,您有一个第一个家长: 12043 它有两个孩子: 12484和12485 子项现在父项12484有子项12486。这里的孩子12486的百分比是0.6,不是100%。这不好 孩子现在父母12485有了孩子12487。这里的孩子12487的百分比是1或100%。这没关系 我需要求每个嵌套子项的百分比之和并获得该值,因为它的总和不等于100%,然后我必须显示一条消息。我很难提出这个问题。有人能帮我一下吗 这就是我尝试过的,我要终止声明。在语句完成之前,已耗尽最大递归100。错误消息Sql 递归CTE…处理嵌套的父/子记录,sql,sql-server,recursion,Sql,Sql Server,Recursion,我有以下记录: 我的目标是检查每位家长的子女总数,确保其为1%或100% 在上面的示例中,您有一个第一个家长: 12043 它有两个孩子: 12484和12485 子项现在父项12484有子项12486。这里的孩子12486的百分比是0.6,不是100%。这不好 孩子现在父母12485有了孩子12487。这里的孩子12487的百分比是1或100%。这没关系 我需要求每个嵌套子项的百分比之和并获得该值,因为它的总和不等于100%,然后我必须显示一条消息。我很难提出这个问题。有人能帮我一下吗 这就是
with cte
as (select cp.parent_payee_id,
cp.payee_id,
cp.payee_pct,
0 as level
from dbo.tp_contract_payee cp
where cp.participant_id = 12067
and cp.payee_id = cp.parent_payee_id
union all
select cp.parent_payee_id,
cp.payee_id,
cp.payee_pct,
c.level + 1 as level
from dbo.tp_contract_payee cp
inner join cte c
on cp.parent_payee_id = c.payee_id
where cp.participant_id = 12067
)
select *
from cte
我相信类似以下的方法应该有效:
WITH RECURSIVE recCTE AS
(
SELECT
parent_payee_id as parent,
payee_id as child,
payee_pct
1 as depth,
parent_payee_id + '>' + payee_id as path
FROM
table
WHERE
--top most node
parent_payee_id = 12043
AND payee_id <> parent_payee_id --prevent endless recursion
UNION ALL
SELECT
table.parent_payee_id as parent,
table.payee_id as child,
table.payee_pct,
recCTE.depth + 1 as Depth,
recCTE.path + '>' + table.payee_id as path
FROM
recCTE
INNER JOIN table ON
recCTE.child = table.parent_payee_id AND
recCTE.child <> table.payee_id --again prevent records where parent is child
Where depth < 15 --prevent endless cycles
)
SELECT DISTINCT parent
FROM recCTE
GROUP BY parent
HAVING sum(payee_pct) <> 1;
这与您的不同之处主要在于联合之前的递归种子查询和联合之后的递归术语查询的WHERE语句。我认为您的限制太严格了,特别是在递归术语中,因为您希望允许12067到的子记录,但是您只允许12067作为父id拉入
不过,在这里,我们从示例表中提取12043的每个子代及其收款人pct。然后,我们分析最终选择中的每个父代及其所有收款人pct的总和,这实际上是该父代的第一个子女的sumpayee pct。如果其中任何子代的总数不是1,则我们在输出中显示父代
无论如何,在您的查询和我的查询之间,我认为这非常接近需求,因此如果这不起作用,那么应该进行一些调整,以使您准确地到达需要的位置