2016-04-11 27 views
0

SQL'de bir tabloda hiyerarşide herhangi bir döngü olup olmadığını kontrol etmek istiyorum. (Aşağıdaki örnek.) Herhangi bir döngünün oluşup oluşmadığına bakmalıdır. Yinelemeli bir cte denediğimde sonsuz bir döngü oluşturdu.Bir hiyerarşide ilmekli bağımlılık olup olmadığını kontrol edin

veri:

enter image description here şu ana kadar ebeveyn hiyerarşisi birlikte, veri tablosu tüm çocuk elemanları listeler

+2

kullandığınız ve SQL zaten soruya çalıştı (vb SQLSunucusu, Oracle, Postgres) RDBMS hangi ekleyebilir miyim? –

+0

Postgres'te "ziyaret edilen" öğeleri bir dizide toplayabilir ve diziyi, CTE –

+0

MS SQL Server 2008 R2 kullanıyorum. Lütfen bana sorguyu verebilir misiniz? – SChowdhury

cevap

0

dairesel bir referans bulunan (ya da daha fazla anne olduğu yerde) ve bir göstergesi dairesel bir referans olduğunu Çocuğun hiyerarşisinde bulunmuş olup olmadığını göstermek için:

with cte as 
(select t.Child Original_Child, 
     t.Parent, 
     t.Child, 
     '|' + convert(varchar(max),t.Parent) + '|' + convert(varchar(max),t.child) + '|' hierarchy_list, 
     convert(int,case Parent when Child then 1 else 0 end) circular_ind 
from DataTable t 
union all 
select c.Original_Child, 
     t.Parent, 
     t.Child, 
     coalesce('|' + convert(varchar(max),t.Parent),'') + c.hierarchy_list hierarchy_list, 
     convert(int, 
       sign(charindex('|' + convert(varchar(max),t.parent) + '|',c.hierarchy_list)) 
       ) circular_ind 
from cte c 
join DataTable t on t.Child = c.Parent 
where c.circular_ind=0), 
cte_final as 
(select c.*, 
     row_number() over (partition by original_child 
          order by len(hierarchy_list) desc) rn from cte c) 
select * from cte_final 
where rn=1 
option (maxrecursion 0)