2013-02-26 8 views
2

I ont une exigence dans lequel j'ai 3 tablesrequête SQL avec des valeurs séparées par des virgules

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 

je besoin d'une requête qui me donne un résultat comme celui-ci

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

C'est ce que j'ai jusqu'à présent !!

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

Votre requête et vos définitions de table ne correspondent pas? Lesquels sont corrects? – sgeddes

Répondre

1

Je ferais somethng comme ça, où vous utilisez l'ID du principal QUERY dans votre sous-requête

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 

Cela vous donnera tout le rôle pour une Compagnie. Si le rôle n'existe pas, vous aurez une valeur 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

Vous pouvez utiliser CROSS APPLY pour obtenir le résultat:

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) 

Voir SQL Fiddle with Demo

Questions connexes