我需要批量发送一封电子邮件,其中包含与该特定用户的电子邮件相关联的每门课程。以下查询将返回所有课程和与之关联的用户的列表。
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;
有关如何工作的更详细说明,请参见此答案。
编辑
要将其限制为仅课程用户,可以将逻辑移至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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句