我有两张这样的表:
RoleType
,列ID为int,名称为varchar(50)
Usertable
,列ID为bigint,RoleTypeID为varchar(50)
我在roletypeid
中usertable
以逗号分隔,因为用户可以拥有多个角色。
请在下面找到详细图片:
任何帮助都会受到赞赏。
谢谢,
答案 0 :(得分:1)
正如评论中所建议的那样,您必须重新设计表结构以避免以逗号分隔的值。
以下是适用于您的答案的解决方案,应该适用于SQL Server 2008。
首先将表格转换为XML格式:
DECLARE @xml xml
SELECT @xml = (
SELECT CAST('<id userid="'+CAST(ID as nvarchar(max))+'"><r>'+REPLACE(RoleTypeID,',','</r><r>')+'</r></id>' as xml)
FROM usertable
FOR XML PATH('')
)
这部分将为您提供如下XML:
<id userid="1">
<r>1</r>
<r>2</r>
</id>
<id userid="2">
<r>1</r>
<r>3</r>
</id>
<id userid="3">
<r>2</r>
<r>3</r>
</id>
然后我们可以使用CTE在规范化表中使用逗号分隔角色转换ID,并与RoleType
表连接以获取角色名称:
;WITH cte AS (
SELECT t.v.value('../@userid','bigint') as ID,
rt.Name
FROM @xml.nodes('/id/r') as t(v)
INNER JOIN RoleType rt
ON rt.ID = t.v.value('.','bigint')
)
SELECT DISTINCT ID,
STUFF((SELECT ','+Name
FROM cte
WHERE ID = c.ID
FOR XML PATH('')
),1,1,'') as Roles
FROM cte c
输出:
ID Roles
1 Admin,Doctor
2 Admin,Nurse
3 Doctor,Nurse