关联表的使用

stevenjin 2018-11-03 11:55:25
有以下2个表,而且表A是临时表。
任务:将部门ID翻译成部门名称。

表A:
员工ID 部门ID 姓名 考分
001 D001 张三 90
002 D002,D003 刘杰 90
001 D001 王五 90
002 D002,D003 刘春 90

表 B:
部门ID 部门名称
D001 技术部
D002 采购部
D003 销售部

最终:
员工ID 部门名称 姓名 考分
001 技术部 张三 90
002 采购部,销售部 刘杰 90
001 技术部 王五 90
002 采购部,销售部 刘春 90
...全文
53 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-11-04
  • 打赏
  • 举报
回复
你这个如果格式非常固定,“简化”也可以。 但最好是不要这样,因为不通用。 打个比方: '12,3' like '%1%' 是不是能得到结果? 确定可以得到,但你真正要找的是 单独一个1 ,不正确了。 简化了,就容易造成一些错误,没必要。
stevenjin 2018-11-04
  • 打赏
  • 举报
回复
我把WHERE后面的,简化了,也可以,不知这样可以吗?
SELECT  
pid AS [员工ID]
,STUFF(
(SELECT ','+ b.dname FROM b
WHERE a.dids LIKE '%'+b.did+'%' FOR XML PATH(''))
,1,1,'') AS [部门名称]
,pname AS [姓名]
,score AS [考分]
FROM a
吉普赛的歌 2018-11-03
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
	pid VARCHAR(10),
	dids VARCHAR(50),
	pname NVARCHAR(20),
	score INT	
)
CREATE TABLE b(
	did VARCHAR(50),
	dname NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO a 
 SELECT 'N001','D001','张三','90' 
 UNION ALL SELECT 'N002','D002,D003','刘杰','90' 
 UNION ALL SELECT 'N001','D001','王五','90' 
 UNION ALL SELECT 'N002','D002,D003','刘春','90'
 
INSERT INTO b
 SELECT 'D001','技术部' 
 UNION ALL SELECT 'D002','采购部' 
 UNION ALL SELECT 'D003','销售部'  
 
SELECT  
	pid AS [员工ID] 
	,STUFF(
		(SELECT ','+ b.dname FROM b 
		 WHERE ','+a.dids+',' LIKE '%,'+b.did+',%' FOR XML PATH(''))
		,1,1,'') AS [部门名称]
	,pname AS [姓名]
	,score AS [考分]
FROM a
吉普赛的歌 2018-11-03
  • 打赏
  • 举报
回复
简单点说就是将 select 中的 字段结果集 变成 xml 。 但由于 节点名称又是 空串, 所以看起来就是 字符串组合在一起 。
stevenjin 2018-11-03
  • 打赏
  • 举报
回复
群举这个可以用,但这里的 FOR XML PATH('')是什么意思呀?
SELECT ','+ b.dname FROM b 
         WHERE ','+a.dids+',' LIKE '%,'+b.did+',%' FOR XML PATH(''))
        ,1,1,'') AS [部门名称]

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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