使用逗号分隔值的SQL查询
我有一个要求,其中我有3张桌子 联系信息 联系人角色 IdContactRoleLookup 我需要一个能给出这样结果的查询使用逗号分隔值的SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个要求,其中我有3张桌子 联系信息 联系人角色 IdContactRoleLookup 我需要一个能给出这样结果的查询 idcontactrolename Contacts -------------------------------------------------------- Admin Blah1,Blah1;Blah2,Blah2,Blah3,Blah3 Secretary Blah4,
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>>'
我会这样做,在子查询中使用主查询的ID
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
这将为您提供一个公司的所有角色。如果角色不存在,您将有一个空值。我会这样做,在子查询中使用主查询的ID
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
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
这将为您提供一个公司的所有角色。如果角色不存在,您将拥有空值
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
您可以使用交叉应用来获得结果:
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)
请参见您可以使用交叉应用来获得结果:
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)
请参见您的查询和表定义不匹配?哪个是正确的?您的查询和表定义不匹配?哪个是正确的?