sql - TSQL 逗号分隔

标签 sql sql-server tsql

我正在编写一个导出函数,需要将联系人导出到 Excel,但我遇到了技术障碍 - 或者也许我的 SQL 技能差距更接近事实。 ;)

场景如下: 我的数据库中有很多联系人。每个联系人可以有许多不同的角色,例如联系人可以是 C# 开发人员和 DBA,或者 DBA 和 IT 经理。它们分为三个表,如下所示:

-------------------   -------------------   -------------------
*     Contact     *   *   ContactRole   *   *      Role       *
-------------------   -------------------   -------------------
* ID              *   * ContactID       *   * ID              *
* Name            *   * RoleID          *   * Name            *
* Address         *   -------------------   -------------------
-------------------   

不太难理解。有一组联系人和一组角色。这些由相应 ID 上的 ContactRole 表连接起来。

导出联系人时,我需要在导出中有一列,所有角色均以逗号分隔,例如 C# Developer, DBADBA, IT-manager 。 导出将从 ASP.NET/C# 代码隐藏中完成,因此我想如果需要的话,我可以在代码中完成此操作,但我感觉可以在 SQL 中完成。

数据来自SQL Server 2005。

最佳答案

仅仅因为您使用 SQL Server 2005(如果您幸运并且正确设置了所有 XML 设置),这里是您的简单 SQL 查询(纯 SQL,无函数):

SELECT  c.ID, c.Name, c.Address, 
    (   SELECT      r.Name + ','
        FROM        "ContactRole" cr
        INNER JOIN  "Role" r
                ON  cr.RoleID = r.ID
        WHERE       cr.ContactID = c.ID
        ORDER BY    r.ID --r.Name
        FOR XML PATH('')
    ) AS "Roles"
FROM    "Contact" c

要测试它是否适合您,只需执行下面的整个代码段:

WITH "Contact" (ID, Name, Address) AS (
                SELECT 1, 'p1-no role', NULL
    UNION ALL   SELECT 2, 'p2-one role', NULL
    UNION ALL   SELECT 3, 'p3-two roles', NULL
)
, "Role" (ID, Name)AS (
                SELECT 1, 'teacher'
    UNION ALL   SELECT 2, 'student'
)
, "ContactRole" (ContactID, RoleID) AS (
                SELECT 2, 1
    UNION ALL   SELECT 3, 1
    UNION ALL   SELECT 3, 2
)

SELECT  c.ID, c.Name, c.Address, 
    (   SELECT      r.Name + ','
        FROM        "ContactRole" cr
        INNER JOIN  "Role" r
                ON  cr.RoleID = r.ID
        WHERE       cr.ContactID = c.ID
        ORDER BY    r.ID --r.Name
        FOR XML PATH('')
    ) AS "Roles"
FROM    "Contact" c

您应该得到以下结果:

ID          Name         Address     Roles
----------- ------------ ----------- ------------------
1           p1-no role   NULL        NULL
2           p2-one role  NULL        teacher,
3           p3-two roles NULL        teacher,student,

关于sql - TSQL 逗号分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/905818/

相关文章:

mysql - 如何使用外键从两个表中获取所有数据

用于搜索两个表的Mysql查询结构

SQL Server FQDN : Use of IP/Instance unrecognized

sql - 如何使用 SQL 创建多个存储过程

sql-server - T-SQL 使用变量从 View 中选择速度要慢得多

tsql - 如何在没有时间戳列的情况下获取数据库中的表列表?

mysql - 如何删除所有重复行,包括 SQL 中的原始行?

php - 在SQL中显示客户名称列表无访问报告的好方法是什么

java - 如何在android中使用更新语句

sql - 我可以明确强制 SQL Server 不缓存我的查询结果集吗?