sql中处理关联数据返回字符串的方法
前言:
在数据中若出现一个元数据所属于多个数据的情况下,利用sql查询将它所属的的数据拼接在一条数据中。
如一个学生可能会有多个辅导员,我们在导出学生信息的业务中,需要将他的辅导员拼接在一条数据中显示。
编写标量值函数来接受学生的学号,再利用关联查询查出学生的辅导员姓名进行字符串拼接,最后返回该字符串。
Create function [dbo].[F_GetClassTeacher](@ClassNo varchar(100)) returns varchar(8000) begin declare @ varchar(8000); set @ = ''; select @ = @ + TeacherName+'、' from ( select UserName AS TeacherName from ClassTeacher b LEFT join EduPerson c on c.UserId=b.TeacherId where b.ClassNo=@ClassNo and isnull(UserName,'')<>'' )a; if(Len(@)>0) select @=SUBSTRING(@,0,Len(@)); return @ end
在查询的过程的不断的调用该函数是非常耗费资源的,在2w条数据的情况下,带此函数的查询耗时高达16s。
注意此函数中的带有语法糖,对于我们查询出的结果集,对varchar参数进行累加操作时,会遍历结果集进行操作。
Good Behavior:
避免多次的扫描全表,利用视图一次将需要辅导员的信息都保存下来,并通过STUFF函数将同一个班级的辅导员拼接记录在一个结果中。
CREATE VIEW [dbo].[V_GY_ClassTeacherTel] AS WITH TmpCT AS ( SELECT TeacherId, ClassNo FROM dbo.ClassTeacher), TmpEP AS (SELECT UserID, UserName, MoveTel FROM dbo.EduPerson) SELECT DISTINCT ct.ClassNo, STUFF(( SELECT '、' + ep.UserName FROM TmpCT t LEFT JOIN TmpEP ep ON t.TeacherId = ep.UserID WHERE t.ClassNo = ct.ClassNo FOR XML PATH('') ),1,1,'') TeacherName, STUFF(( SELECT '、' + ep.MoveTel FROM TmpCT t LEFT JOIN TmpEP ep ON t.TeacherId = ep.UserID WHERE t.ClassNo = ct.ClassNo FOR XML PATH('') ),1,1,'') TeacherTel FROM TmpCT ct;
注意STUFF的中的查询技巧,通过FOR XML PATH函数,按照班级对辅导员进行结果集的拼接。
在利用学生和班级信息来查询辅导员信息即可,经测试2w条数据在3s内查询完毕。