串联组后一个场BY(Concatenate one field after GROUP BY)

2019-07-04 07:20发布

这个问题已经被问过很多次左右,但没有一个答案是令人满意的我的情况。

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

我处理的一个DataObjectVersions包含多个版本的大约120万唯一对象(增加)表。 我需要连接从一个特定领域的每一个独特的对象更改。

现在我用在第三季度呈现的XML路径的解决方案,但运行在该表上这样的查询是整体性能的灾难。 SQL服务器开始19mn后retun数据。 知道了这个数据将超过两次加入,你能想象的影响。

我在寻找最有效的可扩展性意识的方式来连接由其他领域分组不同行的同一字段的值(这当然不是一个键)。 为了更精确,这是在数据仓库的视图内使用。

编辑:

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

   [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]

Answer 1:

试试这个:

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)


文章来源: Concatenate one field after GROUP BY