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内查询完毕。

posted @ 2021-05-12 15:51  zhouslthere  阅读(350)  评论(0编辑  收藏  举报