P.D
P.D
خواندن ۱ دقیقه·۱ سال پیش

چگونه می توانیم با sql در یک ساختار سلسله مراتبی(Parent/Child) مثلا یک جدول بازگشتی(Recursive) بچه ها(برگها) را پیدا کنیم؟

برای استخراج برگها(leaf) در یک رابطه سلسله مراتبی در SQL باید به نمونه ای شبیه زیر فکر بکنیم:

این یک نمونه ساده است که برای نمونه از 11 حرف اول الفبای انگلیسی برای این کار استفاده کردم
این یک نمونه ساده است که برای نمونه از 11 حرف اول الفبای انگلیسی برای این کار استفاده کردم

در ساختارهای سلسله مراتبی(Parent/Chlid) و درختی(Tree) به برگ ها (leaf)ها node نیز گفته میشه. این برگها دیگه زیرمجموعه یا childی نداره.

برای مثال در تصویر بالا اینها F,H,I,J,K برگ(leaf) یا همان بچه آخر هستند.


برای این که با استفاده از کوئری این مقادیر رو استخراج کنیم، لازمه مقادیری از فیلد (ستون) child رو که هیچ گونه ردی در فیلد parent ندارند رو جدا کنیم. مثال تصویر بالا رو در صورتی که به صورت ستون های parent و child پیاده کنیم پس لطفا به کد sql و تصویر محتوا که در عکس بالا نیز به صورت دستی کشیده شده توجه کنید:

SELECT * FROM dbo.RecursiveTest AS x

WHERE

Id NOT IN

(SELECT ParentId FROM dbo.RecursiveTest WHERE ParentId = x.id)

در اینجا کل اطلاعاتی که من برای تست در جدول sql نگه داشتم آوردم
در اینجا کل اطلاعاتی که من برای تست در جدول sql نگه داشتم آوردم

اگه بخوایم به خروجی مورد نظرمون که برگ ها هستن برسیم در sql باید کد بالا رو بنویسیم که نتیجه اش میشه این:

در قسمت پایین تصویر میتونید خروجی مورد نظر رو ببینید یعنی همون برگ ها(F,H,I,J,K)
در قسمت پایین تصویر میتونید خروجی مورد نظر رو ببینید یعنی همون برگ ها(F,H,I,J,K)

البته این کار رو با left join هم میشه انجام داد...

با استفاده از left join میشه یه جدول رو با خودش join زد (بین ستون Id از اولی و parentId ازدومی) و در صورتی که در رکوردی از جدول دوم null پیدا شد یعنی اون Id هیچ گونه child یا زیرمجموعه ای نداره! و leaf هست که خواهیم داشت:

SELECT t1.* FROM @t AS t1

LEFT OUTER JOIN @t AS t2 ON t1.id = t2.refid

WHERE t2.id IS NULL

parent childساختار سلسله مراتبیrecursiveپیدا کردن برگ هاleaf
شاید از این پست‌ها خوشتان بیاید