PDA

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



nafisehk
یک شنبه 19 آبان 1392, 12:14 عصر
سلام
یه table که parent ها و childها به صورت سلسله مراتبی هستن.

name id parent
2 1 a
3 2 b
4 3 c
-1 4 d

اگه بر اساس id=2 بخوام سر کنم باید همه Parent های اون و بیاره
اینجوری-> d/c/b
تو تاپیکای دیگه هم نگا کردم مشکلم حل نشد

nafisehk
یک شنبه 19 آبان 1392, 16:23 عصر
پرنت هاش و بدست اوردم

with cte as (

select OrgUntID,OrgUntParentID,OrgUntName

from OrgUnitInfo

where OrgUntID=79

union all

select o.OrgUntID,o.OrgUntParentID,o.OrgUntName

from OrgUnitInfo o

inner join cte c on (c.OrgUntParentID=o.OrgUntID)



)


select t.OrgUntName from cte t;


اما کوئری که میخوام بنویسم پیچیدست و من باید این و بر اسا س orguntid با یه Tbale دیگه Join بزنم:اشتباه:
حالا دو تا سوال برام مطرح شده چه جوری این و با بقیه کوئری هام(که Join چن تاجدوله) join بزنم و اینکه نتیجه کوئری بالا اینجوریه

کارمند حسابداری
واحد حسابداری
مدیر عامل
میخوام این 3 تا سطر و تو یه سطر به این شکل "مدیرعامل/واحد حسابداری/کارمند حسابداری" نمایش بدم ....

دوستان لطفا راهنمایی بفرمائید

hamid_hr
یک شنبه 19 آبان 1392, 16:28 عصر
with cte as (

select OrgUntID,OrgUntParentID,OrgUntName

from OrgUnitInfo

where OrgUntID=79

unionall

select o.OrgUntID,o.OrgUntParentID,o.OrgUntName

from OrgUnitInfo o

innerjoin cte c on (c.OrgUntParentID=o.OrgUntID)



)


select t.OrgUntName+ '/' from cte t FOR XML PATH('')

nafisehk
یک شنبه 19 آبان 1392, 19:20 عصر
with cte as (

select OrgUntID,OrgUntParentID,OrgUntName

from OrgUnitInfo

where OrgUntID=79

unionall

select o.OrgUntID,o.OrgUntParentID,o.OrgUntName

from OrgUnitInfo o

innerjoin cte c on (c.OrgUntParentID=o.OrgUntID)



)


select t.OrgUntName+ '/' from cte t FOR XML PATH('')


سلام
XML چی هست حالا؟:قهقهه::افسرده:میخوام نتیجه این و JOINبزنم با این روشی که شما گفتید میشه؟

nafisehk
دوشنبه 20 آبان 1392, 09:28 صبح
کسی نیست که بتونه راهنمایی کنه؟!
این و که نتونستم join ّزنم function هم تعریف میکنم خطا میده.....


create function [dbo].[GetParentsOrgUnitName](@id int)

returns table



as


return (

with cte as (

select OrgUntID,OrgUntParentID,OrgUntName

from OrgUnitInfo

where OrgUntID=79

union all

select o.OrgUntID,o.OrgUntParentID,o.OrgUntName

from OrgUnitInfo o

inner join cte c on (c.OrgUntParentID=o.OrgUntID)



)


select t.OrgUntName+ '/' from cte t FOR XML path('')



)





خطا:

CREATE FUNCTION failed because a column name is not specified for column 1.

hamid_hr
دوشنبه 20 آبان 1392, 10:50 صبح
XML چی هست حالا؟
اين دستور for xml مياد خروجي رو ميريزه تو يك ركورد كه ميتوني ركوردو به عنوان فايل xml استفاده كني
شما ميخواستي خروجيت كه به اين صورت بود
2
3
4
5
بشه با اين صورت
2/3/4/5
با اين دستور چي ميشه
select t.OrgUntName+ '/' from cte t FOR XML PATH('')

حمیدرضاصادقیان
دوشنبه 20 آبان 1392, 11:09 صبح
سلام.
از چه نسخه ای از SQL Server استفاده میکنید.؟

nafisehk
دوشنبه 20 آبان 1392, 11:52 صبح
اين دستور for xml مياد خروجي رو ميريزه تو يك ركورد كه ميتوني ركوردو به عنوان فايل xml استفاده كني
شما ميخواستي خروجيت كه به اين صورت بود
2
3
4
5
بشه با اين صورت
2/3/4/5
با اين دستور چي ميشه
select t.OrgUntName+ '/' from cte t FOR XML PATH('')

این دستور درست عمل میکنه مشکل این بود که تو Join به مشکل برمیخوردم اما مشکلم حل شد یک فانکشن نوشتم به جای join
فانکشن

USE [OADataAR]



GO


/****** Object: UserDefinedFunction [dbo].[GetParentsOrgUnitName] Script Date: 11/11/2013 12:33:06 ******/


SET ANSI_NULLS ON



GO


SET QUOTED_IDENTIFIER ON



GO


ALTER function [dbo].[GetParentsOrgUnitName](@id int)

returns table



return


(


with cte as (

select OrgUntID,OrgUntParentID,OrgUntName,RecordDeleted

from OrgUnitInfo

where OrgUntID=@id

union all

select o.OrgUntID,o.OrgUntParentID,o.OrgUntName,o.RecordD eleted

from OrgUnitInfo o

inner join cte c on (c.OrgUntParentID=o.OrgUntID)

where o.RecordDeleted<>1



and


c.RecordDeleted<>1



)


select (select t.OrgUntName+'/' from cte t for xml path('')) as m



)





کوئری

select ri.RolID,ri.RolName+'/'+(select * from GetParentsOrgUnitName(ri.OrgUntID))+'/'+oi.OrgName as Role

from UserRole ur Left join RoleInfo ri on ur.RoleID=ri.RolID

left join OrgInfo oi on oi.OrgID=ri.OrgID

where

ur.UserID=181 and(ur.RecordDeleted<>1 and ri.RecordDeleted<>1 and oi.RecordDeleted<>1)

nafisehk
دوشنبه 20 آبان 1392, 11:53 صبح
سلام.
از چه نسخه ای از SQL Server استفاده میکنید.؟

sql2008 r2

nafisehk
دوشنبه 20 آبان 1392, 13:19 عصر
sql2008 r2


1 سوال دیگه
این اطلاعات وارد یه گرید میشه برای سرچ کردن باید یه تابع دیگه بنویسم که عبارتی که سرچ شده رو هم به عنوان پارامتر پاس بدم؟؟؟


ri.RolName+'/'+(select*from GetParentsOrgUnitName(ri.OrgUntID))+'/'+oi.OrgName asRole

این کویرئه که باید مقدار Function هم بررسی شه


select ri.RolName+'/'+

(select * from GetParentsOrgUnitName(ri.OrgUntID))+

oi.OrgName as Role,ri.RolID,oui.OrgUntParentID

from RoleInfo ri left join RolTypeInfo rti

on ri.RolTypeID=rti.RolTypeID

left join OrgUnitInfo oui

on ri.OrgUntID=oui.OrgUntID

left join OrgInfo oi

on ri.OrgID=oi.OrgID

where

((ri.RolName like '%%' or ri.RolName like '%%') or (oi.OrgName like '%%' or oi.OrgName like '%%')) and

(ri.RecordDeleted<>1 and rti.RecordDeleted<>1 and oi.RecordDeleted<>1)