代码之家  ›  专栏  ›  技术社区  ›  Noah

使用MS SQL Server 2005,如何将详细记录合并到单个逗号分隔的列表中

  •  2
  • Noah  · 技术社区  · 17 年前

    背景:**我正在运行**MS2005 . 我有一个主表(ID,MDESC)和一个详细表(MID,DID,DDESC),数据如下

    1 MASTER_1
    2 MASTER_2
    1 L1 DETAIL_M1_L1
    1 L2 DETAIL_M1_L2
    1 L3 DETAIL_M1_L3
    2 L1 DETAIL_M2_L1
    2 L2 DETAIL_M2_L2
    

    如果我用

    SELECT M.*, D.DID FROM MASTER M INNER JOIN DETAIL D on M.ID = D.MID
    

    我得到如下列表:

    1 MASTER_1 L1
    1 MASTER_1 L2
    1 MASTER_1 L3
    2 MASTER_2 L1
    2 MASTER_2 L2
    

    问题: 是否有任何方法可以使用MS SQL select语句将详细记录放入逗号分隔的列表中,如下所示:

    1 MASTER_1 "L1, L2, L3"
    2 MASTER_2 "L1, L2"
    
    5 回复  |  直到 17 年前
        1
  •  3
  •   AnthonyWJones    17 年前

     CREATE FUNCTION [dbo].[FN_DETAIL_LIST]
     (
         @masterid int
     )
     RETURNS varchar(8000)
     AS 
     BEGIN
         DECLARE @dids varchar(8000)
    
         SELECT @dids = COALESCE(@dids + ', ', '') + DID
         FROM DETAIL
         WHERE MID = @masterid
         RETURN @dids
     END
    

    用法:-

    SELECT MASTERID, [dbo].[FN_DETAIL_LIST](MASTERID) [DIDS]
    FROM MASTER
    
        2
  •  2
  •   Noah    17 年前

    感谢Bill Karwin链接中的概念,它是 交叉应用 这就成功了

    SELECT ID, DES, LEFT(DIDS, LEN(DIDS)-1) AS DIDS
     FROM MASTER M1 INNER JOIN DETAIL D on M1.ID = D.MID 
      CROSS APPLY (
        SELECT DID + ', '
        FROM MASTER M2 INNER JOIN DETAIL D on M2.ID = D.MID 
        WHERE M1.ID = M2.ID
        FOR XML PATH('')
       ) pre_trimmed (DIDS)
    GROUP BY ID, DES, DIDS
    

    结果:

    ID  DES        DIDS
    --- ---------- ---------------
    1   MASTER_1   L1, L2, L3
    2   MASTER_2   L1, L2
    
        3
  •  1
  •   user53794    17 年前

    联合是你的朋友。

    declare @CSL vachar(max)
    
    set @CSL = NULL
    select @CSL = coalesce(@CSL + ', ', '') + cast(DID as varchar(8))
    from MASTER M INNER JOIN DETAIL D on M.ID = D.MID
    
    select @CSL
    

    你可以把它放到一个函数中。。。但这可能无法提供您需要/想要的性能。

        4
  •  1
  •   Community Mohan Dere    9 年前

    这就是MySQL的目的 GROUP_CONCAT() 聚合函数。不幸的是,在其他不支持此功能的RDBMS品牌中复制此功能并不容易。

    看见 Simulating group_concat MySQL function in Microsoft SQL Server 2005?

        5
  •  0
  •   BenMorel Manish Pradhan    12 年前

    我认为您需要一个函数才能在最新版本的SQL Server中正常工作:

    http://sqljunkies.com/WebLog/amachanic/archive/2004/11/10/5065.aspx?Pending=true