当前位置: 代码迷 >> Sql Server >> sql server数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中解决方法
  详细解决方案

sql server数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中解决方法

热度:82   发布时间:2016-04-24 09:43:19.0
sql server数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
现在有两个表,表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

------解决思路----------------------
引用:

简单高效
  相关解决方案