关键词:
【中文标题】使用 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【问题描述】:客户端报告在执行存储过程时重复出现非常奇怪的行为。他们的代码运行在一个易... 查看详情