برای استخراج برگها(leaf) در یک رابطه سلسله مراتبی در SQL باید به نمونه ای شبیه زیر فکر بکنیم:
در ساختارهای سلسله مراتبی(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 باید کد بالا رو بنویسیم که نتیجه اش میشه این:
با استفاده از 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