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)
können Sie fügen die RDBMS (SQL Server, Oracle, Postgres etc.) Sie verwenden, und die SQL Sie bereits auf die Frage versucht? –
In Postgres können Sie die "besuchten" Elemente in einem Array aggregieren und das Array in der Join-Bedingung des rekursiven CTE überprüfen –
Ich verwende MS SQL Server 2008 R2. Können Sie mir bitte die Anfrage stellen? – SChowdhury