zoukankan      html  css  js  c++  java
  • 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内查询完毕。

  • 相关阅读:
    洛谷P2334
    线性基
    6.28 模拟赛解题报告
    左偏树
    哈夫曼树 Huffman
    CSP/NOIP 之前还需要学/复习的东西
    CF718C
    6.13 模拟赛结题报告
    关于模拟退火
    『笔记』网络流
  • 原文地址:https://www.cnblogs.com/Xieyiincuit/p/14760156.html
Copyright © 2011-2022 走看看