PDA

View Full Version : پیدا کردن تمامی فرزندان یک والد !



amir_3d_mad
شنبه 08 خرداد 1389, 17:54 عصر
سلام .

من جدولی دارم با فیلدهای زیر :

SID : شماره گره

SPID : شماره والد

SNAme : نام گره

حال میخواهم تابعی در خود SQLServer بنویسم که با دریافت یک شماره گره (SID) ، تمامی فرزندان آن گره را در صورت وجود در یک جدول برگرداند !

جستجوی زیادی در وب کردم ، ولی به نتیجه مطلوب هنوز نرسیده ام !

البته تابع برعکس اش را دارم که با گرفتن شماره یک فرزند ، تمامی والدهای آنرا تحت جدولی برمیگرداند !

لطفاً کمک بفرمایید .

amir_3d_mad
شنبه 08 خرداد 1389, 18:08 عصر
بنده با استفاده از پست : http://www.barnamenevis.org/forum/showpost.php?p=961366&postcount=6

و اعمال تغییراتی در آن به کد زیر رسیدم که دقیقاً نیاز من را بر طرف میکند :

ALTER PROC tree (@nodeID INT) AS
BEGIN
;WITH cte AS
(SELECT SID, SPID
FROM Structure
WHERE SPID = @nodeID
UNION ALL
SELECT t.SID, t.SPID
FROM cte
JOIN Structure t
ON t.SPID = cte.SID)
SELECT SID + ''
FROM cte

END

ولی دو مشکل دارم :

1 - اول اینکه این یک SP هستش و من بلد نیستم اونرو به تابع تبدیل کنم ! البته نمیدونم امکانش هست یا نه ؟

2 - و دوم اینکه میخوام این کد شماره گره ورودی به خودش رو هم برگردونه ! در حالیکه فعلاً فقط فرزندان اونرو برمیگردونه !

amir_3d_mad
یک شنبه 09 خرداد 1389, 16:30 عصر
از اساتید کسی نیست کمکی بکنه ؟؟؟

hamed.rezaei
دوشنبه 10 خرداد 1389, 00:09 صبح
شما دو جدول را در نظر بگیر جدول گره(s) (sid,sname) و جدول والد(sp)(spid,sid,spname) که sid در جدول والد کلید خارجی برای sid درجدول گره است.

select *
from sp
where exists (select *
from s
where sid='your choice'
and s.sid=sp.sid)

محمد سلیم آبادی
دوشنبه 10 خرداد 1389, 14:17 عصر
ولی دو مشکل دارم :

1 - اول اینکه این یک SP هستش و من بلد نیستم اونرو به تابع تبدیل کنم ! البته نمیدونم امکانش هست یا نه ؟

2 - و دوم اینکه میخوام این کد شماره گره ورودی به خودش رو هم برگردونه ! در حالیکه فعلاً فقط فرزندان اونرو برمیگردونه !
سلام،
برای سوال اول، چون کوئری مجموعه را بر میگرداند نمی توانید از توابع معمولی Scalar برای خروجی دادن استفاده کنید در این حالت می تونید یک TVF ایجاد کنید. که در عبارت SELECT از آن استفاده کنید.

برای سوال دوم باید در SELECT اولی به در ماده ی WHERE به جای SPID باید SID قرار بدین تا گره ی ریشه هم انتخاب بشه.

amir_3d_mad
سه شنبه 11 خرداد 1389, 12:45 عصر
در این حالت می تونید یک TVF ایجاد کنید

بنده هیچ اطلاعاتی در مورد TVF ندارم ! لطفاً بیشتر توضیح دهید و نحوه استفادشو بفرمایید .

در ضمن بنده با کلی کلنجار رفتن با SQL ، تابع زیر را نوشتم که فعلاً به نظر من کار مورد نظر را انجام میدهد ! تا نظر اساتید چی باشه ؟؟؟


Create FUNCTION ReadAllChilds
(
@Sid int
)
RETURNS @Ret TABLE
(
Depth int primary key IDENTITY(1,1),
Sid int NOT NULL,
Sname nvarchar(50)
)
as
begin

WITH cte AS


(SELECT SID, SPID ,SName
FROM Structure
WHERE SID = @Sid
UNION ALL
SELECT SID, SPID ,SName
FROM Structure
WHERE SPID = @Sid
UNION ALL
SELECT t.SID, t.SPID, t.SName
FROM cte
JOIN Structure t
ON t.SPID = cte.SID)


INSERT INTO @Ret ([sid], [SName])
SELECT distinct [sid],[SName] FROM CTE;


return;
end

محمد سلیم آبادی
سه شنبه 11 خرداد 1389, 14:38 عصر
TVF دقیقه همان چیزی است که دارین ازش استفاده می کنید یعنی table-valued function. البته TVF به دو نوع تقسیم می شه. Inline و multistatement که شما از نوع دوم استفاده کردین.

برای استفادش:
SELECT * FROM ReadAllChilds(@Sid) --end