Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 递归CTE…处理嵌套的父/子记录_Sql_Sql Server_Recursion - Fatal编程技术网

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

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%,然后我必须显示一条消息。我很难提出这个问题。有人能帮我一下吗 这就是

我有以下记录:

我的目标是检查每位家长的子女总数,确保其为1%或100%

在上面的示例中,您有一个第一个家长:

12043

它有两个孩子:

12484和12485

子项现在父项12484有子项12486。这里的孩子12486的百分比是0.6,不是100%。这不好

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

我需要求每个嵌套子项的百分比之和并获得该值,因为它的总和不等于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,则我们在输出中显示父代

无论如何,在您的查询和我的查询之间,我认为这非常接近需求,因此如果这不起作用,那么应该进行一些调整,以使您准确地到达需要的位置