PDA

View Full Version : بدست اوردن تمامی parent های یک نود



moferferi
شنبه 11 خرداد 1398, 13:56 عصر
با سلام.
من یه جدول برای دسته بندی دارم
CREATE TABLE [dbo].[AnbarCategory](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](500) NOT NULL,
[ParentID] [int] NULL,
CONSTRAINT [PK_AnbarCategory] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


و با کد زیر تمامی parent های هر نود را نشون میدم
WITH departmentcte(deptid, department, ParentID, LEVEL, treepath) AS

( SELECT id AS deptid, Title, ParentID, 0 AS LEVEL,

CAST(Title AS nVARCHAR(1024)) AS treepath

FROM AnbarCategory

WHERE ParentID IS NULL

UNION ALL

SELECT d.id AS deptid, d.Title, d.ParentID,

departmentcte.LEVEL + 1 AS LEVEL,

CAST(departmentcte.treepath + ' -> ' +

CAST(d.Title AS nVARCHAR(1024))

AS nVARCHAR(1024)) AS treepath

FROM AnbarCategory d

INNER JOIN departmentcte

ON departmentcte.deptid = d.ParentID
)


SELECT *

FROM departmentcte

ORDER BY treepath;

ولی این کار وقتی جواب میده که بخوام همه نود ها را با parent هاش نشون بدم.
150286
واگه بخوام فقط یک نود (مثلا deptid 13 )را توی یک ردیف با parent هاش نشون بدم کار نمیده و خروجی زیر را داره
150287

mmbguide
یک شنبه 12 خرداد 1398, 09:55 صبح
سلام

میشه یکم بیشتر توضیح بدید. شما depid رو برابر 13 قرار دادید و در کل یک ردیف اطلاعات هم بیشتر ندارید که depid اون برابر 13 باشه. قطعا خروجی یک ردیف بیشتر نیست.

hamid_hr
یک شنبه 12 خرداد 1398, 10:25 صبح
سلام
من تست کردم با همین ساختار و کد ها.
خروجی درست بهم می داد.
فقط شرط رو اینطوری گزاشتم
SELECT * FROM departmentcte t where t.deptid = 13
ORDER BY treepath;

moferferi
یک شنبه 12 خرداد 1398, 13:49 عصر
سلام

میشه یکم بیشتر توضیح بدید. شما depid رو برابر 13 قرار دادید و در کل یک ردیف اطلاعات هم بیشتر ندارید که depid اون برابر 13 باشه. قطعا خروجی یک ردیف بیشتر نیست.

ممنون از شما
میخوام خروجی تصویر ضمیمه 2 برای depid 13 مثل depid 13 در خروجی تصویر 1 باشه

moferferi
یک شنبه 12 خرداد 1398, 13:53 عصر
ممنون hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr)
بله همینا میخوام.
ولی فک کنم شرط را اینجا بزارم اشتباهه
چون اول میره تمام نود ها را پردازش میکنه و بعد فقط توی خروجی اونی که میخوایم را نشون میده.
حالا اگه تعداد نود ها زیاد باشه و من فقط یکیش را بخوام پردازش زیادی انجام میشه

hamid_hr
یک شنبه 12 خرداد 1398, 15:42 عصر
نه درسته
خود sql server متوجه میشه و با کمترین هزینه اجراش میکنه