递归CTE ...处理嵌套的父/子记录

时间:2016-04-13 18:34:49

标签: sql sql-server recursion

我有以下记录:

我的目标是检查每个父母的孩子的总和,并确保它是1(或100%)。

在上面的示例中,您有第一个父级:

12043

它有两个孩子:

12484& 12485

孩子(现在是父母)12484有孩子12486.这里的孩子(12486)有0.6的百分比(不是100%)。这不行。

孩子(现在是父母)12485有孩子12487.这里的孩子(12487)的百分比为1(或100%)。这没关系。

我需要将每个嵌套子项的百分比相加并得到该值,因为它总和不是100%,然后我必须显示一条消息。我很难想出一个查询。有人可以帮我一把吗?

这是我试过的,我得到了“语句终止。最大递归100在语句完成之前已经用完了。”错误信息。

*

1 个答案:

答案 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>