sql - 在 GROUP BY 之后,连接一个字段

  显示原文与译文双语对照的内容
0 0

这个问题被问了很多次,但是没有一个答案对我的情况是满意的。

  1. 问题 1
  2. 问题 2
  3. 问题 3
  4. 问题 4

我正在处理一个 DataObjectVersions 表,它包含了大约 1.2个惟一对象( 并增加)的多个版本。 我需要将每个唯一对象的特定字段的更改连接起来。

现在我使用的解决方案与在三分之一的XML路径,但在这个表上运行这样的查询是总性能。 SQL Server 在 19 mn之后开始retun数据。 知道这些数据将被连接两次,你就可以想象。

我正在寻找最有效的可以伸缩性知识方法,以将不同行的值连接到另一个字段( 这当然是个钥匙) 。 更精确地说,这是在Datawarehouse的视图中使用的。

编辑:

我试图简化描述,但这里是一个完整的概述,我有多个带有以下列的表

 [ID]
 [CreatedTime]
 [CreatedBy]
 [DeletedTime]
 [DeletedBy]
 [ResourceId]
 [AccountId]
 [Type]

视图用于返回所有表的所有记录的联合,这些记录仍将返回相同的列( ( 在我的问题中用版本表描述) ) 。 [ResourceId][AccountId] 是对象的唯一组合标识符( 组成员身份。系统帐户。等等 。 特定的资源分配。[Type] 用于标识不同级别( 如文件分配中的Read/Write/Execute ) 。

所有其他字段都包含相同对象的相同值( 在不同的表中) 。 我需要获取对象并连接 [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]

时间: 原作者:

0 0

尝试这个:


SELECT [CreatedTime]
, [DeletedTime]
, [DeletedBy]
, [ResourceId]
, [AccountId]
, STUFF((select ',' + raType.Type 
 from vwAllAssignments raType 
 where raType.AccountId = vwAllAssignments.AccountId and 
 raType.ResourceId = vwAllAssignments.ResourceId and 
 raType.DeletedBy is null 
 for xml path('')), 1,1,'') AS [Type]
FROM vwAllAssignments
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy]

这样的索引应该有用。


create index IX_vwAllAssignments on vwAllAssignments(AccountId, ResourceId, DeletedBy) include(Type)

原作者:
...