2016-04-13 18 views
0

Aşağıdaki kayıtları var:Recursive CTE ... İç içe ebeveyn ile uğraşan/çocuk kaydeder

Amacım her ebeveyn için çocukların SUM kontrol edin ve 1 emin olmaktır

(veya% 100). Yukarıdaki örnekte

, bir ilk ebeveyn vardır:

2 adet çocuk:

Çocuk (şimdi ana) 12.484 çocuk 12.486 sahiptir. Buradaki çocuk (12486), yüzde 0,6'dır (% 100 DEĞİLDİR). Bu sorun değil.

Çocuk (şimdi ebeveyn) 12485, 12487 numaralı çocuğa sahiptir. Buradaki çocuk (12487),% 1 (veya% 100) oranındadır. Tamamdır.

Yuvalanmış her çocuğun yüzdelerini toplamalı ve bu değeri almam gerekiyor çünkü% 100'e kadar özetlenmiyor, sonra bir ileti görüntülemem gerekiyor. Bunun için bir sorgu ile gelmekte zorlanıyorum. Birisi bana yardım edebilir mi?

Denediğim şey budur ve "Bildirimi sonlandırıldı. Maksimum yineleme 100 ifadesi tamamlanmadan önce tüketildi." hata mesajı.

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 

cevap

2

Ben aşağıdaki gibi bir şey çalışması gerekir inanıyoruz:

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; 

Bu, çoğunlukla Rekürsif Seed (BİRLİĞİ önce sorgu) ve BİRLİĞİ sonra özyinelemeli vadede (sorguda hem WHERE tablolara sizinkinden farklı). 12067'nin çocukları olan kayıtlara izin vermek istediğiniz için, özellikle de özyinelemeli terimleriniz çok kısıtlayıcıdır, ama sonra sadece üstbilginin kimlik numarası olarak 12067'ye izin verin.

Burada her 12043 soyundan (örnek tablonuzdan) ve payee_pct. Daha sonra, her bir ebeveyni nihai SELECT'de analiz ederiz ve hepsinin toplamı, esasen ebeveynin ilk çocuklarının toplamı (payee_pct). Bunlardan herhangi biri toplam 1 değilse, ebeveynleri çıktıda gösteririz.

Sorgulama ile benimki arasında herhangi bir oranda, bunun gereksinimlere oldukça yakın olduğunu düşünürdüm, bu yüzden hile yapmazsanız tam olarak nerede olmanız gerektiğini anlamanız için ince ayarlar yapılmalıdır.