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

     2023-02-24     275

关键词:

【中文标题】使用 MS SQL Server 2005,如何将详细记录合并到一个逗号分隔的列表中【英文标题】:Using MS SQL Server 2005, how can I consolidate detail records into a single comma separated list 【发布时间】:2010-10-07 13:01:30 【问题描述】:

背景:**我正在运行 **MS2005。我有一个 MASTER 表(ID,MDESC)和一个 DETAIL 表(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 选择语句将详细记录放入逗号分隔的列表中,如下所示:

1 MASTER_1 "L1, L2, L3"
2 MASTER_2 "L1, L2"

【问题讨论】:

【参考方案1】:

你需要一个函数:-

 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

【讨论】:

查看发布的没有功能的解决方案......非常漂亮 这突出了为什么在问题中指定版本是好的。 APPLY 是 SQL 2005 的东西。 SQL Server 的寿命往往很长,因此在没有版本信息的情况下,我会选择与 SQL 2000 兼容的答案。 是的,由于拥有 SQL Server 2000,这是我将使用的解决方案,谢谢【参考方案2】:

感谢 Bill Karwin 链接中的概念,正是 CROSS APPLY 使它起作用

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

【讨论】:

我同意它非常巧妙,虽然对 XML 的依赖有点令人不安,但如果在不影响性能的情况下运行得足够好,这是一个很好的解决方案。【参考方案3】:

coalesce 是你的朋友。

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

这不适用于通用查询(即,适用于单个主记录)。

您可以将其放入一个函数中...但这可能无法为您提供所需/想要的性能。

【讨论】:

他可以将类似上面的内容包装到一个函数中,该函数将主表中的 id 作为输入,并返回逗号分隔的字符串。 不错,但在一行上返回所有内容,例如“L1、L2、L3、L1、L2”我需要按主行分组【参考方案4】:

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

见Simulating group_concat MySQL function in Microsoft SQL Server 2005?

【讨论】:

感谢您的链接,SQL Server 中添加了一些我以前从未注意到的 CROSS APPLY 新功能。【参考方案5】:

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

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

【讨论】:

感谢我的想法,但请参阅发布的纯 SQL 解决方案

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

】如何在MSAccess2007或MSSQLServer2005中通过SQL将字段转换为行【英文标题】:HowtoconvertfieldsintorowsthroughSQLinMSAccess2007orMSSQLServer2005【发布时间】:2008-12-0216:24:02【问题描述】:我有一个旧版MSAccess2007表,其中包含52个字段(一年中的每... 查看详情

使用 MS Access 2003 连接到 SQL Server 2005

】使用MSAccess2003连接到SQLServer2005【英文标题】:UsingMSAccess2003toconnecttoSQLServer2005【发布时间】:2009-11-0922:18:02【问题描述】:我父亲建立了一个MSAccess数据库来进行物业管理。现在他想通过互联网与其他用户分享。所以我在Network... 查看详情

仅使用 SQL 将图片插入 SQL Server 2005 图像字段

】仅使用SQL将图片插入SQLServer2005图像字段【英文标题】:InsertPictureintoSQLServer2005ImageFieldusingonlySQL【发布时间】:2009-01-0615:06:23【问题描述】:使用SQLServer2005和ManagementStudio如何将图片插入到表的Image类型列中?最重要的是如何验... 查看详情

如何使用正确的对象顺序编写 MS SQL Server 数据库脚本?

】如何使用正确的对象顺序编写MSSQLServer数据库脚本?【英文标题】:HowcanIscriptanMSSQLServerdatabasewithproperobjectordering?【发布时间】:2010-10-1319:05:02【问题描述】:我正在尝试将MSSQLServer2005数据库编写到单个文件中。到目前为止,... 查看详情

如何使用 PHP 将记录从远程 SQL Server 2005 复制到本地 mySQL?

】如何使用PHP将记录从远程SQLServer2005复制到本地mySQL?【英文标题】:HowtocopyrecordsfromremoteSQLServer2005tolocalmySQLusingPHP?【发布时间】:2011-07-1614:03:44【问题描述】:各位,如何使用PHP将远程SQLServer2005中的视图记录复制到本地mySQL上... 查看详情

从 Ms Access Mdb 文件获取数据到 sql server 2005 的最佳方法

...erver2005【发布时间】:2009-08-2721:59:16【问题描述】:我们使用了一个使用Sqlserver2005作为后端的软件。问题是我们有数据进入访问文件,我们需要将它存储在sqlserver表中。我已经准备好sqlserver表了。我不需要我在MDB 查看详情

SQL Server 2005:“保护”存储过程免受 MS Access 使用的 FMTONLY 模式的影响

】SQLServer2005:“保护”存储过程免受MSAccess使用的FMTONLY模式的影响【英文标题】:SQLServer2005:"Protecting"storedproceduresfromFMTONLYmodeusedbyMSAccess【发布时间】:2008-11-1919:56:34【问题描述】:我们的一些存储过程包含条件逻辑,... 查看详情

如何使用单引号 sql server 2005 插入文本

】如何使用单引号sqlserver2005插入文本【英文标题】:Howtoinserttextwithsinglequotationsqlserver2005【发布时间】:2010-10-2100:20:12【问题描述】:我想插入带单引号的文本例如john\'stotableinsqlserver2005数据库【问题讨论】:但是在现有的单引... 查看详情

如何使用 SQL Server 2005 创建基于 SQL 语句集的视图?

】如何使用SQLServer2005创建基于SQL语句集的视图?【英文标题】:HowtoCreateViewbasedontheSetofSQLStatementsusingSQLServer2005?【发布时间】:2011-06-1405:45:09【问题描述】:我已经编写了一组SQL语句,最终给出了一个表。我想将整套语句创建为... 查看详情

如何将 Visual Studio 2010 网站连接到 SQL Server 2005

...我需要将VisualStudio2010网站连接到SQLServer2005。我的网站是使用C#的ASP.NET,在.NETFramework2.0上我用谷歌搜索了几个小时,但我输入的 查看详情

在 MS SQL Server 2005 中获取日期的周数?

...视图来选择这个额外的信息以及其他几个字段,因此不能使用存储过程。我知道可以创建一个UDF来解决问题,但如果可能的话,我宁愿只向该数据库添加一个 查看详情

如何使用 SQL Server 2005 在 NHibernate 中映射 uint

】如何使用SQLServer2005在NHibernate中映射uint【英文标题】:HowtomapuintinNHibernatewithSQLServer2005【发布时间】:2009-03-1216:25:59【问题描述】:我的实体上有一个uint类型的属性。比如:publicclassEnitypublicuintCountget;set;当我尝试将其持久化到... 查看详情

MS Access 2003 + 到 SQL Server 2005 的链接表 + Windows 身份验证 = 慢

...时间】:2009-07-2410:56:13【问题描述】:当从WindowsXP客户端使用Windows身份验证时,我们的MSAccess应用程序与SQLServer2005的链接表很慢。我们已 查看详情

如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点

】如何在MSSQL2005中使用SQLXQuery修改多个节点【英文标题】:HowtomodifymultiplenodesusingSQLXQueryinMSSQL2005【发布时间】:2009-08-0510:52:30【问题描述】:在一张表中,我有以下内容。ParameterID(int)ParameterValue(XML)--------------------------1<USER>... 查看详情

使用存储过程将记录从 SQL Server 复制到 SQL Server (2005)

】使用存储过程将记录从SQLServer复制到SQLServer(2005)【英文标题】:CopyrecordsusingstoredprocedurefromSQLServertoSQLServer(2005)【发布时间】:2018-02-1607:46:06【问题描述】:我有一个简单的存储过程来选择、格式化和复制TimeCard数据库中的记录... 查看详情

如何在 SQL Server 2000/2005/2008 中使用 FLOAT 转换小数位数

】如何在SQLServer2000/2005/2008中使用FLOAT转换小数位数【英文标题】:HowDecimalplacesareconvertedusingFLOATinSQLServer2000/2005/2008【发布时间】:2009-12-0209:48:28【问题描述】:在这个SOquestion中,OP想要将0放在小数位上以获得他的结果。现在我... 查看详情

如何将 SQL Server 2005 查询导出到 CSV

】如何将SQLServer2005查询导出到CSV【英文标题】:HowtoexportSQLServer2005querytoCSV【发布时间】:2010-10-2210:01:19【问题描述】:我想将一些SQLServer2005数据导出为CSV格式(用引号分隔的逗号)。我可以想到很多复杂的方法来做到这一点,... 查看详情

MS SQL Server 2005 - 存储过程“自发中断”

】MSSQLServer2005-存储过程“自发中断”【英文标题】:MSSQLServer2005-StoredProcedure"SpontaneouslyBreaks"【发布时间】:2009-06-1821:19:55【问题描述】:客户端报告在执行存储过程时重复出现非常奇怪的行为。他们的代码运行在一个易... 查看详情