View Full Version : بازیابی سلسله مراتبی تا بی نهایت در SQL
Saber_Fatholahi
چهارشنبه 27 مرداد 1389, 17:40 عصر
با سلام
من یه جدول دارم که اطلاعات یک سری در آن ذخیره شده است
در این جدول هر آیتم یک فیلد به عنوان آیتم پدر دارد (ParentId)
حال من می خوام یه کوئیری بنویسم که اینهارو به صورت سلسله مراتبی برگردونی باید چیکار کنم؟
اگه دوستان محبت کنن راهنمایی کنن ممنون می شم
majidrajab
چهارشنبه 27 مرداد 1389, 18:26 عصر
از inner join بين جداول استفاده كن و به اطلاعات جداول دسترسي پيداكنيد
محمد سلیم آبادی
چهارشنبه 27 مرداد 1389, 23:15 عصر
در مورد Recursive CTE تحقیق کنید.
Saber_Fatholahi
پنج شنبه 28 مرداد 1389, 15:49 عصر
یه نوضیح فارسی مختصر در این زمینه می خوام
خیلی کارم گیرشه
واسه منو های سلسله مراتبی می خوام که بی نهایت زیر منو دارن
ممنوت میشم اگه دوستان بگن
محمد سلیم آبادی
پنج شنبه 28 مرداد 1389, 16:03 عصر
یک توضیح خیلی مختصری می دم که امید وارم کمکتون بکنه:
فرض کنید این درخت را می خواهیم در جدول پیاده سازی کنیم:
/*
A
|
B
/|\
C D E
/
F
*/
خب ساده ترین و شناخته ترین روش Adjacency List Model هست که به شکل زیره:
DECLARE @Tree TABLE
(child CHAR(1) NOT NULL PRIMARY KEY,
parent CHAR(1) NULL);
INSERT INTO @Tree (child, parent)
SELECT 'A', NULL UNION ALL
SELECT 'B', 'A' UNION ALL
SELECT 'C', 'B' UNION ALL
SELECT 'D', 'B' UNION ALL
SELECT 'E', 'B' UNION ALL
SELECT 'F', 'C';
و برای بدست آوردن زیر شاخته (subtree/branch) یک node از کوئری زیر کمک می گیریم. و چون تا بی نهایت می خواهیم این کار ادامه پیدا کنه از hint زیر استفاده شده:
OPTION (MAXRECURSION 0);
اینم کوئری:
WITH CTE AS
(
SELECT child, parent, 1 AS lvl
FROM @Tree
WHERE parent IS NULL
UNION ALL
SELECT T.child, T.parent, C.lvl + 1 AS lvl
FROM @Tree AS T
JOIN CTE AS C
ON T.parent = C.child
)
SELECT * FROM CTE
OPTION (MAXRECURSION 0);
و اینم نتیجه اش همراه با level:
child parent lvl
----- ------ -----------
A NULL 1
B A 2
C B 3
D B 3
E B 3
F C 4
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.