gpt4 book ai didi

sql - TSQL 逗号分隔

转载 作者:行者123 更新时间:2023-12-03 01:05:02 26 4
gpt4 key购买 nike

我正在编写一个导出函数,需要将联系人导出到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com