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)
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.