如何用ISNULL、STUFF在SQL中从两表获取逗号分隔的汇报人邮箱?
解决用户汇报对象邮箱拼接问题
我来帮你搞定这个需求!你要实现的是把每个用户对应的所有汇报对象邮箱用逗号拼接起来对吧?之前的查询应该是关联逻辑或者子查询的写法没捋对,我给你整理了一个正确的SQL语句:
SELECT u.UserId, u.Email AS 用户邮箱, ISNULL(STUFF( ( SELECT ',' + rpt.Email FROM UsersReportsTo urt INNER JOIN Users rpt ON urt.ReportsTo = rpt.UserId WHERE urt.UserId = u.UserId FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ), '') AS 汇报对象邮箱列表 FROM Users u LEFT JOIN UsersReportsTo urt ON u.UserId = urt.UserId GROUP BY u.UserId, u.Email
关键逻辑说明:
- 外层查询从
Users表获取用户基础信息,用LEFT JOIN确保即使没有汇报对象的用户也能被查询到,不会被过滤掉 - 子查询部分:通过
UsersReportsTo关联到汇报对象的Users记录,筛选出当前用户对应的所有汇报对象邮箱;FOR XML PATH(''), TYPE会把多条邮箱记录拼接成一个XML字符串,再用.value('.', 'NVARCHAR(MAX)')转换成普通文本格式 STUFF函数的作用是去掉拼接字符串开头多余的逗号,ISNULL则处理用户没有汇报对象的情况,返回空字符串而不是NULL- 最后用
GROUP BY是为了避免因为一个用户对应多个汇报对象,导致用户记录重复出现
额外优化提示:
如果你的UsersReportsTo表中可能存在重复的ReportsTo记录(比如同一个用户多次关联同一个汇报对象),可以在子查询里加上DISTINCT,避免邮箱重复拼接:
SELECT DISTINCT ',' + rpt.Email
内容的提问来源于stack exchange,提问作者Kalpesh Koli
相关产品推荐
相关产品推荐

