PDA

View Full Version : پیدا کردن رکورد های فرزند و نوه



sanaz.dadkhah
جمعه 02 خرداد 1393, 14:30 عصر
سلام من ساختار زیر را دارم


id
name
parentID


1
ali
Null


2
sanaz
1


3
shima
2


4
maryam
1


5
marjan
Null



می خواهم select ای بزنم که با دادن ali فرزند های آن یعنی Sanaz و shima و maryam را بدست بیاورم
میشه راهنمایی کنید؟(در اصل پدر و فرزند و نوه و ....)

mahdavi1456
جمعه 02 خرداد 1393, 14:52 عصر
به نظر من روش اشتباهه. شما یه جدول پدر تعریف کنید و بعد یه جدول فرزندها. کلید جدول پدر رو داخل جدول فرزند ها استفاده کنید و join بزنید. اینجوری افزونگی زیادی داره.

ali_md110
جمعه 02 خرداد 1393, 15:38 عصر
روششون شاید برای رابطه یک به چند اینجور موجودیتها اشتباه باشه و نیاز به جدول دیگه داشته باشند ولی به این طریقی که دوستمون عمل کردند بهش میگن مدلهای خود ارچاع دهنده یا Self Referencing Entities
بیشتر بدین صورت به کار میاد مثل همین سایت در نظر بگیرید : شما یک پست زدید و من به پست شما جواب دادم
الان کوئریشون بدین صورته


SELECT MyTbl.FName, MyTbl_1.FName AS Nave
FROM MyTbl INNER JOIN
MyTbl AS MyTbl_1 ON MyTbl.id = MyTbl_1.ParentID
WHERE (MyTbl.FName = N'ali')

جدول من اسمش Mytbl است که به عنوان جدول پدر به حساب میارم
بعدش میام دوباره همین جدولم رو در کوئری شرکت میدم و اسمش میزارم Mytbl_1 و با جدول اول یعنی Mytbl یک جستجوی inner join یک به جند میسازمش

sanaz.dadkhah
جمعه 02 خرداد 1393, 17:32 عصر
مرسی از بابت جواب شما.
اما یک مشکلی وجود دارد در کوئری بالا فقط فرزند ها یعنی sanaz , maryam نمایش داده می شوند و فرزند sanaz به عبارتی shima نمایش داده نمی شود در حالت کلی این کوئری فقط فرزند ها را نمایش می دهد و فرزند فرزند را نمایش نمی دهد

ali_md110
جمعه 02 خرداد 1393, 18:54 عصر
همونطور که خودتون گفتید میخاید با شرط علی بیاد نوه هاش رو پیدا کنه این یعنی اول بیا طبق علی فیلتر بکن وقتی فیلتر شد پس دیگه ردیفی که علی نداره مثل شیما حذف میشه
شما اینجوری میگید : چون شیما فرزند علی هست پش هرجا طبق اسم علی فیلتر کردیم کوئری زدیم بیاد واسمون شیما هم نشون بده در صورتیکه این فکر به نظرم صحیح نباشه
اگر دوست داشتید که نوه دیگران مثلا شیما رو هم نشون بده باید فیلتر رو بردارید یا از کرزرها استفاده کنید بدین صورت که ابتدا روی جدولتون فیلتر یزنید بریزید درون کرز و انجا با حلقه ها باز داده هاتون رو واکشی کنید شاید مشکلتون حل شه
به نظر دوستمون Mahdaviجدولتون رو به دو قسمت تبدیل کنید راحت تر ه

sanaz.dadkhah
جمعه 02 خرداد 1393, 19:01 عصر
ببینید من در اصل برای کامنت سایتم به این مورد نیاز دارم یعنی هر نظر پاسخ داره و هر پاسخ هم خودش می تونه پاسخ داشته باشه
میشه گفت جدول کامنت ورد پرس از ی روشی مثله روشه بالا استفاده کرده.در مورد دو قسمت هم همین مشکل را فکر کنم داشته باشم فرض کنیم می خواهم گره های سطح 4 را واکشی کنم؟؟
بازم ممنون از بابت جواب شما

ali_md110
جمعه 02 خرداد 1393, 20:14 عصر
ok گرفتم
این کد تست کنید به نظرم مشکلتون حل بشه



DECLARE @name nvarchar(50)

SELECT @name = 'ali'

;WITH Returnvalue AS(
SELECT * FROM MyTbl
WHERE FName = @name
UNION ALL
SELECT tbl.*
FROM MyTbl tbl INNER JOIN
Returnvalue rv ON tbl.ParentID = rv.ID
)

SELECT *
FROM Returnvalue