2013-02-26 2 views
2

У меня есть требование, где у меня есть 3 таблицыSQL-запроса с запятыми значений

ContactInfo

idContactinfo FirstName Lastname  idCOmpanyid 
--------------------------------------------------- 
1    Blah1  Blah1   1 
2    Blah2  Blah2   1 
3    Blah3  Blah3   1 
4    Blah4  Blah4   1 

ContactRole

idcontactrole  IdContactRoleName  idContactInfo 
------------------------------------------------------ 
1      1      1 
2      1      2 
3      1      3 
4      2      4 

IdContactRoleLookup

idcontactRole   RoleName 
---------------------------------- 
1      Admin 
2      Secretary 

Мне нужен запрос, который дает мне результат, как этот

idcontactrolename   Contacts 
-------------------------------------------------------- 
Admin     Blah1,Blah1;Blah2,Blah2,Blah3,Blah3 
Secretary    Blah4,Blah4 

Это то, что я до сих пор !!

SELECT l.sValue 
    , SUBSTRING((
         SELECT C.sLast + ',' + C.sFirst + ';' 
         FROM contactinfo c 
         inner join contactrole crole 
         ON crole.idcontactinfo = c.idcontactinfo 
         WHERE crole.idcompany = '<<blah>>' 
         and c.idcompany = '<<blah>>' 
         FOR XML PATH('') 

        ), 1, 1000000) 
FROM CONTACTROLE CR 
inner join contactinfo c on 
cr.idcontactinfo = c.idcontactinfo 
inner join lookupdata l on cr.idlookuprole = l.idlookupdata 
where c.idcompany = '<<blah>>' 
+0

Ваш запрос и ваши определения таблиц не совпадают? Что правильно? – sgeddes

ответ

1

Я бы сделать somethng, как это, где вы используете идентификатор главного QUERY в вашем подзапрос

SELECT  
l.sValue 
    , SUBSTRING((
         SELECT C.sLast + ',' + C.sFirst + ';' 
         FROM contactinfo c 
         inner join contactrole crole 
         ON crole.idcontactinfo = c.idcontactinfo 
         WHERE c.idcompany = '<<blah>>' 
AND c.idcontactrole = CR.idcontactrole 
         FOR XML PATH('') 

        ), 1, 1000000) 

FROM CONTACTROLE CR 
inner join lookupdata l on cr.idlookuprole = l.idlookupdata 

Это даст вам всю роль одного Compagnie. Если роль не существует, у вас будет значение NULL.

2
SELECT 
    RoleName, 
    STUFF(
     (
      SELECT ';' + b.FirstName + ', ' + b.LastName 
      FROM ContactRole a 
      INNER JOIN ContactInfo b 
        ON a.idContactInfo = b.idContactinfo 
      WHERE a.IdContactRoleName = r.idcontactRole 
      FOR XML PATH ('')) 
      , 1, 1, '') AS NamesList 
FROM IdContactRoleLookup r 
GROUP BY idcontactRole, RoleName 
1

Вы можете использовать CROSS APPLY, чтобы получить результат:

select distinct l.RoleName, 
    left(list, len(list) -1) list 
FROM CONTACTROLE CR 
inner join IdContactRoleLookup l 
    on cr.IdContactRoleName = l.idcontactRole 
cross apply 
(
    select C1.Lastname + ',' + C1.FirstName + ';' 
    from CONTACTROLE CR1 
    inner join contactinfo c1 
    on cr1.idContactInfo = c1.idContactinfo 
    where cr.IdContactRoleName = cr1.IdContactRoleName 
    FOR XML PATH('') 
) t2 (list) 

См SQL Fiddle with Demo

Смежные вопросы