PDA

View Full Version : Recursive CTE



cactuskhan
دوشنبه 13 اردیبهشت 1389, 09:07 صبح
سلام من یه select با شرایط زیر میخواستم بزنم آیا کسی می تونه کمکم کنه کارم بد جوری گیره!:عصبانی++:

درنظر بگیرید ما چندین گروه خبری بطور درختی داریم که هر شاخه می تونه خبری های خودشو داشته باشه،حالا میخوام اگه یه شاخه از گروه های خبری انتخاب شد تمامی اخبار شاخه های زیرین هم توی result بیاد ! :متفکر:

محمد سلیم آبادی
دوشنبه 13 اردیبهشت 1389, 11:37 صبح
سلام،
اگر از نسخه ی 2005 یا بالاتر استفاده می کنید Recursive CTE را در Books Online مطالعه کنید.
برای اینکه یک Query برایتان بتوانیم ایجاد کنیم نیاز هست یک نمونه از داده ها و یک نمونه از نتیجه ی مورد نظر و همچنین ساختار جدولتان لزامی است.

cactuskhan
دوشنبه 13 اردیبهشت 1389, 13:43 عصر
این ساختار جدول من می باشد !

http://www.jetup.ir/photo/img/308051cf9f7cf0a30b950b829c7c26de/Capture.JPG (http://www.jetup.ir)
این اطلاعات گروه خبری

http://www.jetup.ir/photo/img/0b1b234529bc953b3e484163da4dfaab/Capture3.JPG (http://www.jetup.ir)
این اطلاعات خبرها

http://www.jetup.ir/photo/img/bc169e81a2221fc27e6497e411282959/Capture2.JPG (http://www.jetup.ir)
حالا من میخوام اگه از جدول خبرها خواستم اخبار بخش ورزشی توسط groupid و مقدار 2 به من برگردون اخبار 1 الی 8 رو به من برگردونه چون تمام این ها زیر مجموعه گروه ورزشی هستند !

امیدوارم خوب توضیح داده باشم !

محمد سلیم آبادی
دوشنبه 13 اردیبهشت 1389, 15:11 عصر
بله توضیحاتتون تا حدودی کامل بود ولی فکر کنم نتونستین یک مثال جامع تر و دقیق تر بیارین. عرض می کنم:
شما مشخص نکردین که آیا می خواهین تنها داده های یک سطح پایین تر از گره ی مورد نظر را بدست بیارین یا خیر. در مثال در جدول گروهها ID های 5 تا 8 فرزند ID شماره ی 2 هستند و هیچ ID ای وجود ندارد که فرزند ID های 5 تا 8 باشد. پس تکلیف این مساله که آیا زمانی که مثلا ID شماره 6 فرزند داشته باشد آیا فرزند این ID را نیاز درین یا خیر. و اگر نیاز دارین تا چند سطح؟

و همچنین از چه نسخه ی SQL Server استفاده می کنید؟

cactuskhan
دوشنبه 13 اردیبهشت 1389, 15:25 عصر
1- آی دی 1 الی 3 در جدول خبرها زیر مجموعه آی دی 5 از جدول گروه خبری و آدی 4 و 5 از جدول خبرها زیر مجموعه آی دی 6 درجدول گروه خبری می باشد چرا میگین وجود نداره ؟

2- بله نیاز دارم تمامی تمام رکوردهای گره های پایین رو نیاز دارم یعنی اگه گفتم اخبار ورزشی رو میخام از آی دی 1 الی 8 در جدول خبرها رو به من بده !(چون تمام اینها خبرهای گروه ورزشی هستند)

3- 2005

محمد سلیم آبادی
دوشنبه 13 اردیبهشت 1389, 15:38 عصر
اینو امتحان کنید:


;WITH CTE(Id) AS
( SELECT Id FROM NEWS_GROUP WHERE Id = 2
UNION ALL
SELECT N.Id FROM CTE C INNER JOIN NEWS_GROUP N ON C.Id = N.Parent)
SELECT N.*
FROM NEWS N
INNER JOIN CTE C
ON N.GroupID = C.Id;