PDA

View Full Version : Row Values Concatenation



Neo Persian
دوشنبه 16 مهر 1386, 20:33 عصر
3 تا Table دارم با نام های Users , Roles و UserRoles

در جدول Users دو فیلد دارم با نام های id و username
در جدول Roles دو فیلد دارم با نام های id و role
در جدول UserRoles هم باز دو فیلد دارم userid و roleid که ارتباط بین هر user و role اون مشخص میشه که البته هر user ممکن هست بیش از یک role داشته باشد پس این جدول PK ندارد

مشکل در select گرفتن از این جدول هست به طوری که میخوام در هر select یک column که حاوی username و یک column هم شامل role های این user به صورت تفکیک شده از هم با یک | باشند یعنی به این صورت:

username---------------------------roles
---------------------------------------------
Bahram----------Admin|Manager|User
Ali---------------------User|Manager



من با جستجویی که کردم به این QUERY رسیدم:



SELECT userid,
MAX( CASE seq WHEN 1 THEN CONVERT(VARCHAR, roleid) ELSE '' END ) + '| ' +
MAX( CASE seq WHEN 2 THEN CONVERT(VARCHAR, roleid) ELSE '' END ) + '| ' +
MAX( CASE seq WHEN 3 THEN CONVERT(VARCHAR, roleid) ELSE '' END ) + '| ' +
MAX( CASE seq WHEN 4 THEN CONVERT(VARCHAR, roleid) ELSE '' END )
FROM ( SELECT p1.userid, p1.roleid,
( SELECT COUNT(*)
FROM UserRoles p2
WHERE p2.userid = p1.userid
AND p2.roleid <= p1.roleid )
FROM UserRoles p1 ) D ( userid, roleid, seq )
GROUP BY userid ;


مشکلی که این QUERY داره
1. فقط id های user ها و Role هاشونو بر میگردونه و راهی برای ارتباط با جدول های دیگه و گرفتن اسم user ها و role ها پیدا نکردم
2.اگه به طور مثال یک user دو role داشته باشد نتیجه به این صورته:


userid--------------------roleid
---------------------------------
1--------------------------1|2||

اساتید اگه راه حلی به نظرشون میرسه ممنون میشم مطرح کنند

Neo Persian
سه شنبه 17 مهر 1386, 11:29 صبح
یعنی کسی نیست به داد ما برسه؟؟

پویا
سه شنبه 17 مهر 1386, 12:03 عصر
راجع به این موضوع یه مبحثی قبلا بود
به راهنمایی آقای ثباتی توجه کن

http://barnamenevis.org/forum/showthread.php?t=78423&highlight=function