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

林中轩 2017-09-08 11:41:53
有两个表,表a中
序号 主管领导
1 1,2,3
2 2,4

表b中
序号 姓名
1 李一
2 刘二
3 张三
4 李四

怎么联合查询出
序号 主管领导 主管领导姓名
1 1,2,3 李一,刘二,张三
2 2,4 刘二,李四
...全文
615 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 andyliulin 的回复:

SELECT  *
       ,主管领导姓名 = STUFF(( SELECT ',' + 姓名
                         FROM   b
                         where   PATINDEX('%,' + RTRIM(序号) + ',%',',' + a.主管领导 + ',')>0
                         ORDER BY PATINDEX('%,' + RTRIM(序号) + ',%',',' + a.主管领导 + ',')        --加上排序不变(如:2,1,3)
                       FOR XML PATH('')), 1, 1,'')
FROM    a
这样应该没问题
这种查询 在数据量很少的时候 没问题,数据量(B表)多了 就算A表查询的行数少,B表也要全表扫描。 可以在代码里分两次查询
吉普赛的歌 2017-09-09
  • 打赏
  • 举报
回复 1
USE tempdb
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
CREATE TABLE a([序号] int,[主管领导] VARCHAR(300))
CREATE TABLE b([序号] int,[姓名] NVARCHAR(300))
INSERT INTO a ([序号] ,[主管领导]) VALUES (1,'1,2,3')
INSERT INTO a ([序号] ,[主管领导]) VALUES (2,'2,4')
INSERT INTO b ([序号],[姓名]) VALUES (1,N'李一')
INSERT INTO b ([序号],[姓名]) VALUES (2,N'刘二')
INSERT INTO b ([序号],[姓名]) VALUES (3,N'张三')
INSERT INTO b ([序号],[姓名]) VALUES (4,N'李四')

SELECT a.[序号],a.[主管领导], stuff(
(
	SELECT ','+b.[姓名] 
	FROM b 
	WHERE ','+a.[主管领导]+',' LIKE '%,'+CAST(b.[序号] AS varchar(50))+',%'
	FOR XML PATH('')
) ,1,1,'') AS [主管领导姓名]
FROM a

/*
序号	主管领导	主管领导姓名
1	    1,2,3	    李一,刘二,张三
2	    2,4	        刘二,李四
*/
道素 2017-09-09
  • 打赏
  • 举报
回复

;with a(序号,主管领导) AS (  
   select 1,'1,2,3' union all
   select 2,'2,4'
),b(序号,姓名) AS (
   select 1,N'李一' union all
   select 2,N'刘二' union all
   select 3,N'张三' union all
   select 4,N'李四'
)
select m.序号,stuff(c.names,1,1,'') as 主管领导姓名 from a as m
outer apply(
  select ','+b.姓名 from a,b where charindex(','+ltrim(b.序号)+',',','+a.主管领导+',')>0 and a.序号=m.序号 for xml path('')
) c(names)

  	序号	主管领导姓名
1	1	李一,刘二,张三
2	2	刘二,李四

林中轩 2017-09-08
  • 打赏
  • 举报
回复

SELECT  *
       ,主管领导姓名 = STUFF(( SELECT ',' + 姓名
                         FROM   b
                         where   PATINDEX('%,' + RTRIM(序号) + ',%',',' + a.主管领导 + ',')>0
                         ORDER BY PATINDEX('%,' + RTRIM(序号) + ',%',',' + a.主管领导 + ',')        --加上排序不变(如:2,1,3)
                       FOR XML PATH('')), 1, 1,'')
FROM    a
这样应该没问题

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧