2016-04-13 8 views
0

私は、次のレコードを持っている:再帰CTE ...ネストされた親を扱っ/子供たちが記録し

私の目標は、それぞれの親のための子供のSUMをチェックし、それが1であることを確認することです

(または100%)。上記の例では

、あなたが最初に親があります。

をそれは2人の子供を持っています

子供(今の親)12484は、子12486を持っています。ここの子供(12486)には0.6の割合があります(これは100%ではありません)。これはOKではありません。

子(現在の親)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前クエリ)の両方でWHERE文と再帰的用語(UNION後のクエリであなたと異なっ)。あまりにも制限があると思います。特に、再帰的な言葉では、12067の子であるレコードを許可したいのですが、12067を親IDとして引っ張るだけです。

ここでは、 12043の子孫(あなたの例の表から)、それはpayee_pctです。次に、最後のSELECTの各親と、その親の最初の子合計(payee_pct)であるpayee_pctsの合計を分析します。それらのいずれかが合計1でない場合、出力に親を表示します。

質問と質問の間には、これは要件にかなり近いと思いますので、これがトリックではない場合には、必要な場所を正確に把握する必要があります。

関連する問題