现在有两个表,表a中
序号 主管领导
1 1,2,3
2 2,4
表b中
序号 姓名
1 李一
2 刘二
3 张三
4 李四
怎么联合查询出
序号 主管领导 主管领导姓名
1 1,2,3 李一,刘二,张三
2 2,4 刘二,李四
------解决思路----------------------
--2005以上版本
select * ,主管领导姓名=stuff((select ','+姓名 from B where charindex(','+convert(varchar,b.序号),','+a.主管领导)>0 for xml path('')),1,1,'') from A
------解决思路----------------------
CREATE FUNCTION fn_Merge(@IDs VARCHAR(50))
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @Str VARCHAR(200)
SET @Str=''
SELECT @Str=@Str+','+姓名 FROM b WHERE ','+@IDs+',' LIKE '%,'+RTRIM(序号)+',%'
RETURN (STUFF(@Str,1,1,''))
END
GO
SELECT *,dbo.fn_Merge(主管领导) FROM a
------解决思路----------------------
[code]WITH a(序号,主管领导) AS (
SELECT 1,N'1,3,2' UNION ALL --注意这里打乱了次序
SELECT 2,N'2,4'
)
,b(序号,姓名) AS (
SELECT 1,N'李一' UNION ALL
SELECT 2,N'刘二' UNION ALL
SELECT 3,N'张三' UNION ALL
SELECT 4,N'李四'
)
,c AS (
SELECT 序号,
主管领导,
Convert(nvarchar(100),主管领导) numberList,
Convert(nvarchar(100),'') nameList
FROM a
UNION ALL
SELECT c.序号,
c.主管领导,
Convert(nvarchar(100),
SUBSTRING(c.numberList,
CHARINDEX(N',',
c.numberList+N',')+1,
100)),
Convert(nvarchar(100),
c.nameList+N','+b.姓名)
FROM c
JOIN b
ON CHARINDEX(Convert(nvarchar(11),b.序号)+N',',
c.numberList+N',') = 1
WHERE c.numberList <> ''
)
SELECT 序号,
主管领导,
STUFF(nameList,1,1,N'') 主管领导姓名
FROM c
WHERE numberList = ''
ORDER BY 序号[/code]
序号 主管领导 主管领导姓名
----------- -------- --------------------------
1 1,3,2 李一,张三,刘二
2 2,4 刘二,李四
打乱次序后用#1直接拼出来的是这样的结果
序号 主管领导 主管领导姓名
----------- -------- --------------------------
1 1,3,2 李一,刘二,张三
2 2,4 刘二,李四
------解决思路----------------------
可用like/patindex/charindex,注在字符串两边加上","
SELECT *
,主管领导姓名 = STUFF(( SELECT ',' + 姓名
FROM b
WHERE PATINDEX('%,' + RTRIM(序号) + ',%',
',' + a.主管领导 + ',')
ORDER BY PATINDEX('%,' + RTRIM(序号) + ',%',',' + a.主管领导 + ',') --加上排序不变(如:2,1,3)
FOR XML PATH('')
), 1, 1, '')
FROM a
------解决思路----------------------
简单高效
