سلام،
برای این منظور باید از recursive cte کمک گرفت.
فرض کنید درختی به شکل زیر داریم:
و هدف بدست آوردن تمام زیر شاختههای گره A است.
ابتدا باید تمام گره هایی که مقدار گره پدرشان برابر با A است را بدست بیاریم یعنی گرههای B و C
حالا باید تمام گره هایی که گره پدرشان B و یا C است را بدست بیاریم یعنی گرههای D E F G
و در مرحله بعد باید تمام گره هایی را بدست بیاریم که گره پدرشان برابر با یکی از مقادیر بدست آمده در مرحله قبل (یعنی D E F G) یعنی H
این الگوریتم را توسط Recursive CTE پیاده میکنیم:
موفق باشید
برای این منظور باید از recursive cte کمک گرفت.
فرض کنید درختی به شکل زیر داریم:
/* A / \ B C | /|\ D E F G | H */
و هدف بدست آوردن تمام زیر شاختههای گره A است.
ابتدا باید تمام گره هایی که مقدار گره پدرشان برابر با A است را بدست بیاریم یعنی گرههای B و C
حالا باید تمام گره هایی که گره پدرشان B و یا C است را بدست بیاریم یعنی گرههای D E F G
و در مرحله بعد باید تمام گره هایی را بدست بیاریم که گره پدرشان برابر با یکی از مقادیر بدست آمده در مرحله قبل (یعنی D E F G) یعنی H
این الگوریتم را توسط Recursive CTE پیاده میکنیم:
declare @t table ( id char(1) primary key not null, pid char(1) null --references @t ); insert @t values ('A', null), ('B','A'),('C','A'), ('D','B'), ('H','D'),('E','C'),('F','C'),('G','C'); with cte as ( select id from @t where pid = 'A' union all select t.id from cte c join @t t on t.pid = c.id ) select * from cte
موفق باشید