我有以下记录:
我的目标是检查每个父母的孩子的总和,并确保它是1(或100%)。
在上面的示例中,您有第一个父级:
12043
它有两个孩子:
12484& 12485
孩子(现在是父母)12484有孩子12486.这里的孩子(12486)有0.6的百分比(不是100%)。这不行。
孩子(现在是父母)12485有孩子12487.这里的孩子(12487)的百分比为1(或100%)。这没关系。
我需要将每个嵌套子项的百分比相加并得到该值,因为它总和不是100%,然后我必须显示一条消息。我很难想出一个查询。有人可以帮我一把吗?
这是我试过的,我得到了“语句终止。最大递归100在语句完成之前已经用完了。”错误信息。
*
答案 0 :(得分:3)
我相信以下内容应该有效:
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;
这与您的不同之处主要在于递归种子(UNION之前的查询)和递归术语(UNION之后的查询)的WHERE
语句中。我相信你的限制性太强,特别是在递归术语中,因为你想允许12067岁的孩子的记录,但是你只允许12067作为父ID。
但是,在这里,我们将每个12043的后代(来自您的示例表)和它的payee_pct拉出来。然后我们分析最终SELECT中的每个父母以及它所有的payee_pcts的总和,它们实际上是父母的第一个孩子的总和(payee_pct)。如果它们中的任何一个不是总共1,那么我们在输出中显示父项。
无论如何,在你的查询和我的查询之间,我认为这非常接近于要求,因此如果不能做到这一点,那么应该进行调整以准确到达你需要的位置。 / p>