2016-04-11 8 views
0

Ich möchte überprüfen, ob eine Schleife in einer Hierarchie in einer Tabelle in SQL vorhanden ist. (Beispiel unten.) Es sollte zurückkehren, ob irgendeine Schleife gebildet wird. Als ich eine rekursive Cte ​​ausprobierte, bildete sie eine Endlosschleife.Überprüfen, ob eine Schleifenabhängigkeit in einer Hierarchie vorhanden ist

Daten:

enter image description here

+2

können Sie fügen die RDBMS (SQL Server, Oracle, Postgres etc.) Sie verwenden, und die SQL Sie bereits auf die Frage versucht? –

+0

In Postgres können Sie die "besuchten" Elemente in einem Array aggregieren und das Array in der Join-Bedingung des rekursiven CTE überprüfen –

+0

Ich verwende MS SQL Server 2008 R2. Können Sie mir bitte die Anfrage stellen? – SChowdhury

Antwort

0

Im Folgenden werden alle untergeordneten Elemente aus der Datentabelle Liste, zusammen mit ihren Eltern Hierarchie bis zu dem Punkt, eine zirkuläre Referenz gefunden wird (oder, wo es keine mehr Eltern) und eine Anzeige zu zeigen, ob eine zirkuläre Referenz in diesen Kindern Hierarchie gefunden:

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)