سلام
یه table که parent ها و childها به صورت سلسله مراتبی هستن.
name id parent
2 1 a
3 2 b
4 3 c
-1 4 d
اگه بر اساس id=2 بخوام سر کنم باید همه Parent های اون و بیاره
اینجوری-> d/c/b
تو تاپیکای دیگه هم نگا کردم مشکلم حل نشد
سلام
یه 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:30 عصر دلیل: تصیح سول
پرنت هاش و بدست اوردم
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;
اما کوئری که میخوام بنویسم پیچیدست و من باید این و بر اسا س orguntid با یه Tbale دیگه Join بزنم
حالا دو تا سوال برام مطرح شده چه جوری این و با بقیه کوئری هام(که Join چن تاجدوله) join بزنم و اینکه نتیجه کوئری بالا اینجوریه
کارمند حسابداری
واحد حسابداری
مدیر عامل
میخوام این 3 تا سطر و تو یه سطر به این شکل "مدیرعامل/واحد حسابداری/کارمند حسابداری" نمایش بدم ....
دوستان لطفا راهنمایی بفرمائید
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('')
کسی نیست که بتونه راهنمایی کنه؟!
این و که نتونستم join ّزنم function هم تعریف میکنم خطا میده.....
createfunction [dbo].[GetParentsOrgUnitName](@id int)
returnstable
as
return (
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 FORXMLpath('')
)
خطا:
CREATE FUNCTION failed because a column name is not specified for column 1.
اين دستور for xml مياد خروجي رو ميريزه تو يك ركورد كه ميتوني ركوردو به عنوان فايل xml استفاده كنيXML چی هست حالا؟
شما ميخواستي خروجيت كه به اين صورت بود
2
3
4
5
بشه با اين صورت
2/3/4/5
با اين دستور چي ميشه
select t.OrgUntName+ '/' from cte t FOR XML PATH('')
سلام.
از چه نسخه ای از SQL Server استفاده میکنید.؟
این دستور درست عمل میکنه مشکل این بود که تو Join به مشکل برمیخوردم اما مشکلم حل شد یک فانکشن نوشتم به جای join
فانکشن
USE [OADataAR]
GO
/****** Object: UserDefinedFunction [dbo].[GetParentsOrgUnitName] Script Date: 11/11/2013 12:33:06 ******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
ALTERfunction [dbo].[GetParentsOrgUnitName](@id int)
returnstable
return
(
with cte as (
select OrgUntID,OrgUntParentID,OrgUntName,RecordDeleted
from OrgUnitInfo
where OrgUntID=@id
unionall
select o.OrgUntID,o.OrgUntParentID,o.OrgUntName,o.RecordDeleted
from OrgUnitInfo o
innerjoin cte c on (c.OrgUntParentID=o.OrgUntID)
where o.RecordDeleted<>1
and
c.RecordDeleted<>1
)
select (select t.OrgUntName+'/'from cte t forxmlpath(''))as m
)
کوئری
select ri.RolID,ri.RolName+'/'+(select*from GetParentsOrgUnitName(ri.OrgUntID))+'/'+oi.OrgName asRole
from UserRole ur Leftjoin RoleInfo ri on ur.RoleID=ri.RolID
leftjoin OrgInfo oi on oi.OrgID=ri.OrgID
where
ur.UserID=181 and(ur.RecordDeleted<>1 and ri.RecordDeleted<>1 and oi.RecordDeleted<>1)
1 سوال دیگه
این اطلاعات وارد یه گرید میشه برای سرچ کردن باید یه تابع دیگه بنویسم که عبارتی که سرچ شده رو هم به عنوان پارامتر پاس بدم؟؟؟
این کویرئه که باید مقدار Function هم بررسی شهri.RolName+'/'+(select*from GetParentsOrgUnitName(ri.OrgUntID))+'/'+oi.OrgName asRole
select ri.RolName+'/'+
(select*from GetParentsOrgUnitName(ri.OrgUntID))+
oi.OrgName asRole,ri.RolID,oui.OrgUntParentID
from RoleInfo ri leftjoin RolTypeInfo rti
on ri.RolTypeID=rti.RolTypeID
leftjoin OrgUnitInfo oui
on ri.OrgUntID=oui.OrgUntID
leftjoin 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)
آخرین ویرایش به وسیله nafisehk : سه شنبه 21 آبان 1392 در 12:16 عصر