当主表中的id保存为逗号分隔时,从其他表中获取数据

时间:2016-08-12 04:41:45

标签: sql sql-server sql-server-2008

我有两张这样的表:

  • RoleType,列ID为int,名称为varchar(50)

  • Usertable,列ID为bigint,RoleTypeID为varchar(50)

我在roletypeidusertable以逗号分隔,因为用户可以拥有多个角色。

请在下面找到详细图片:

enter image description here

任何帮助都会受到赞赏。

谢谢,

1 个答案:

答案 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