【问题标题】:Get data from other table when id save in main table as comma seperated当id以逗号分隔保存在主表中时从其他表中获取数据
【发布时间】:2016-08-12 14:07:09
【问题描述】:

我有两张这样的表:

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

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

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

请查看以下详细图片:

任何帮助将不胜感激。

谢谢,

【问题讨论】:

  • 修复数据库结构。检查一下:stackoverflow.com/questions/444251/…
  • 请发布预期结果、当前结果和 DDL、DML 以重现问题。
  • 在单列中存储“逗号分隔”的 ID 列表是一种非常糟糕的设计 - 不要这样做。使用适当的、相关的方式来处理这个!将一个列表塞进一个单独的列中会给你带来无尽的悲伤和麻烦——只是不要这样做。说真的。
  • 感谢您的宝贵回复。

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


【解决方案1】:

按照 cmets 的建议,您必须重新设计表结构以避免逗号分隔值。

这是您的答案的解决方案,应该可以在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多