在SQL Server 2008中连接字符串的不确定数目

悬崖

我需要批量发送一封电子邮件,其中包含与该特定用户的电子邮件相关联的每门课程。以下查询将返回所有课程和与之关联的用户的列表。

select (cm.course_id + ': '+ cm.course_name) as course,
u.lastname, u.firstname, u.email from course_users cu
join users u on u.pk1 = cu.users_pk1
join course_main cm on cm.pk1 = cu.crsmain_pk1

问题在于,为了使邮件合并正常工作,我只需要列出每个用户一次,并且所有相关课程都在该行的单个(定界)单元中。

任何帮助表示赞赏!

编辑:删除有关CONCAT()函数的文本,因为它只是分散注意力。

加雷斯

您可以使用SQL Server的XML扩展来连接行:

SELECT  Course = STUFF((SELECT  ';' + cm.course_id + ': '+ cm.course_name
                        FROM    course_users cu
                                INNER JOIN course_main cm
                                    ON cm.pk1 = cu.crsmain_pk1
                        WHERE   u.pk1 = cu.users_pk1
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        u.lastname, 
        u.firstname, 
        u.email
FROM    users u;

有关如何工作的更详细说明,请参见此答案

SQL小提琴上的示例

编辑

要将其限制为仅课程用户,可以将逻辑移至APPLY内,然后检查结果是否为null:

SELECT  Course = STUFF(c.course.value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        u.lastname, 
        u.firstname, 
        u.email
FROM    users u
        CROSS APPLY
        (   SELECT  ';' + cm.course_id + ': '+ cm.course_name
            FROM    course_users cu
                    INNER JOIN course_main cm
                        ON cm.pk1 = cu.crsmain_pk1
            WHERE   u.pk1 = cu.users_pk1
            FOR XML PATH(''), TYPE
        ) c (course)
WHERE   c.course IS NOT NULL;

或添加一个exist子句:

SELECT  Course = STUFF((SELECT  ';' + cm.course_id + ': '+ cm.course_name
                        FROM    course_users cu
                                INNER JOIN course_main cm
                                    ON cm.pk1 = cu.crsmain_pk1
                        WHERE   u.pk1 = cu.users_pk1
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        u.lastname, 
        u.firstname, 
        u.email
FROM    users u
WHERE   EXISTS (SELECT 1 FROM course_users cu WHERE u.pk1 = cu.users_pk1);

SQL Fiddle上的两个示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server 2008和连接字符串

来自分类Dev

在SQL Server 2008中删除()包括()之间的字符串

来自分类Dev

SQL Server 2008:从字符串中查找值

来自分类Dev

SQL Server 2008中的REPLICATE和字符串问题

来自分类Dev

比较SQL Server 2008中的字符串DateTime

来自分类Dev

SQL Server 2008的子字符串

来自分类Dev

Julia ODBC中SQL Server的连接字符串

来自分类Dev

用SQL Server连接字符串中的值

来自分类Dev

SQL Server连接字符串的麻烦

来自分类Dev

UWP SQL Server 连接字符串

来自分类Dev

SQL Server 2008 R2连接字符串错误

来自分类Dev

sql-server 2008 r2 连接两个字符串

来自分类Dev

查找特定的字符和/或字符串SQL Server 2008

来自分类Dev

SQL Server中从右到左的字符串

来自分类Dev

替换SQL Server中的字符串

来自分类Dev

字符串中的SQL Server变量

来自分类Dev

在 SQL Server 中追加字符串

来自分类Dev

在 SQL Server 中拆分字符串

来自分类Dev

如何在SQL Server 2008中将字符串转换为整数?

来自分类Dev

在SQL Server 2008中将字符串转换为日期时间

来自分类Dev

从SQL SERVER 2008中的字符串转换日期和/或时间时,转换失败

来自分类Dev

比较字符串,如果在SQL Server 2008中为NULL

来自分类Dev

如何在SQL Server 2008中将字符串转换为整数?

来自分类Dev

SQL Server 2008-添加到名称列中特定位置的字符串

来自分类Dev

SQL Server连接字符串,密码为“ $”

来自分类Dev

创建连接字符串并使用SQL Server LocalDB

来自分类Dev

Azure VM上SQL Server的连接字符串

来自分类Dev

SQL Server连接字符串-dot(“。”)或“(local)”或“(localdb)”

来自分类Dev

SQL Server + Windows服务+帐户/连接字符串

Related 相关文章

热门标签

归档