2016-04-13 94 views
0

我有如下記錄:遞歸CTE ......處理嵌套的父母/子女記錄

我的目標是檢查孩子的總和爲每個父,並確保它是1(或100%)。

在上面的例子,你有一個第一父:

它有2個孩子:

兒童(現在的父母)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 

回答

2

我相信像下面應該工作:

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作爲父母身份進入。

雖然這裏, 12043的後裔(來自您的示例表),它是payee_pct。然後我們分析最後一個SELECT中的每個父代以及它的所有payee_pcts的總和,這是pay父母的第一個孩子總和(payee_pct)。如果它們中的任何一個不是1,那麼我們在輸出中顯示父代。

無論如何,在您的查詢和我的之間,我會想到這與要求非常接近,所以應該調整以使您確切地知道您需要的位置,如果這不起作用。