这个问题在SO中已经问了很多次,但没有一个答案对我的情况满意。在GROUP BY后连接一个字段
我处理一个包含多个版本的大约120万唯一对象(增加)DataObjectVersions
表。我需要为每个唯一对象连接来自特定字段的更改。
现在我正在使用Q3中提供的XML Path的解决方案,但在此表上运行这样的查询是一个总体性能灾难。 SQL Server在19mn后开始重新调用数据。知道这些数据将会加入两次以上,你可以想象这种影响。
我正在寻找最高效的可伸缩性感知方式来连接由其他字段(当然不是键)分组的不同行的相同字段的值。更确切地说,这是在Datawarehouse的视图中使用的。
编辑:
我试图简化描述,但这里是一个完整的概述 我有多个表与视图用于返回所有的工会下面列
[ID] [CreatedTime] [CreatedBy] [DeletedTime] [DeletedBy] [ResourceId] [AccountId] [Type]
来自所有表格的记录,这些记录仍然会返回相同的列(在我的问题中由版本表格描述)。 [ResourceId]
和[AccountId]
是对象(组成员资格,系统帐户等)的唯一组合标识符。 [Type]
用于标识不同的级别(如文件分配时的读/写/执行)
所有其他字段对于不同的唯一对象包含相同的值(在不同的表中)。我需要获取对象并连接[Type]
列的值。所有行都在后面处理,并且([ResourceId]
,[AccountId]
)组合必须是唯一的(不同类型存在时不是这种情况)。
编辑2:
我使用这个功能:
CREATE FUNCTION [dbo].[GetUniqueType]
(
@ResourceId as uniqueidentifier,
@Account as uniqueidentifier
)
RETURNS nvarchar(100)
AS
BEGIN
return STUFF((select ',' + raType.Type from vwAllAssignments raType where raType.AccountId = @Account and raType.ResourceId = @ResourceId and raType.DeletedBy is null for xml path('')), 1,1,'')
END
GO
vwAllAssignments
是返回所有表行的工会的看法。
最后我选择
SELECT [CreatedTime]
,[DeletedTime]
,[DeletedBy]
,[ResourceId]
,[AccountId]
,dbo.GetUniqueType([ResourceId],[AccountId]) AS [Type]
FROM vwAllAssignments
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy]
你指的是具有类似 “对象”, “V1,V2,V3,V4”? – Diego
是的,但仅适用于特定列,并非所有列如连接类型或更改不同版本的日期 –
请显示您的数据库布局。我在较大的表上使用SQL Server 8中的连接,并获得更好的性能。我怀疑一些放置好的索引将解决性能问题。 –