zoukankan      html  css  js  c++  java
  • 【SQL】通过Sql实现根据分组合并指定列内容的查询 SamWang

    问题:

      最近在做一个项目的时候,遇到这样一个要求,模拟要求如下:  

    ID  SName
    1    张三
    1    李四
    2    刘六
    2    王五
    
    要的结果是
    ID name
    1  张三,李四
    2  刘六,王五
    
    即按ID组查询,并将相同的ID对应SName内容通过逗号合并

    解决思路:

      通过传递不同的id给函数,查询出组合的SName并返回。

    --创建测试表
    IF NOT EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'StudentsInfo') AND OBJECTPROPERTY(id,N'IsUserTable')=1)
    CREATE TABLE StudentsInfo
    (
        Id INT,
        SName NVARCHAR(20)
    )
    GO
    
    --添加测试数据
    INSERT INTO StudentsInfo VALUES (1,'张三')
    INSERT INTO StudentsInfo VALUES (1,'李四')
    INSERT INTO StudentsInfo VALUES (2,'刘六')
    INSERT INTO StudentsInfo VALUES (2,'王五')
    GO
    
    --创建函数
    IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'GetStudentsInfoNamesByID') AND OBJECTPROPERTY(id,N'IsScalarFunction')=1)
        DROP FUNCTION GetStudentsInfoNamesByID
    GO
    CREATE FUNCTION GetStudentsInfoNamesByID(@Id INT)
        RETURNS NVARCHAR(4000)
    AS
    BEGIN
        DECLARE @SNames NVARCHAR(4000)
        SET @SNames = ''
        SELECT @SNames = @SNames+','+SName FROM StudentsInfo WHERE id = @Id
        RETURN STUFF(@SNames,1,1,'')
    END
    GO    
    
    --查询
    SELECT id,dbo.GetStudentsInfoNamesByID(id) AS SNames FROM StudentsInfo GROUP BY id

    总结:

      整体思路还是比较简单的,但是很多时间都不怎么使用函数进行处理,这里也算抛砖引玉做个记录。至于上面的效率问题怎么样,就暂不做考虑了。

    链接:

      下面这两篇博文很不错,用三种方法实现上面的要求,而且还有效率的对比,很细致,推荐一下!(感谢 CrazyJinn的分享)

      关于SQL函数效率的一些测试与思考
      关于SQL一对多关系转换的效率思考(续)

  • 相关阅读:
    redis命令参考(四) set集合
    redis命令参考(三) List列表相关
    redis命令参考(二)
    redis命令参考(一) SortedSet相关
    insert_into_on_dumplicate_key
    laravel深入分析
    开发中GBK+UTF8编码的处理
    ajax封装调用
    linux正则表达式的用法
    linux 如何保证使程序后台运行(nohup &)
  • 原文地址:https://www.cnblogs.com/wangshenhe/p/2784073.html
Copyright © 2011-2022 走看看