在GROUP BY之后连接一个字段

时间:2012-11-30 14:44:50

标签: sql sql-server group-by scalability sql-server-group-concat

这个问题在SO中被多次提出过,但没有一个答案能让我满意。

  1. Question 1
  2. Question 2
  3. Question 3
  4. Question 4
  5. 我正在处理一个DataObjectVersions表,其中包含大约120万个唯一对象的多个版本(并且正在增加)。我需要为每个唯一对象连接特定字段的更改。

    目前我正在使用Q3中提供的XML路径解决方案,但在此表上运行此类查询是一个完全的性能灾难。 SQL Server在19mn之后开始重新调整数据。知道这些数据将被连接两次,你可以想象这种影响。

    我正在寻找最有效的可伸缩性感知方法来连接由其他字段(当然不是密钥)分组的不同行的相同字段的值。更准确地说,这是在Datawarehouse的视图中使用的。

    修改

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

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

    视图用于返回所有表中所有记录的并集,这些记录仍将返回相同的列(在我的问题中由versions表中描述)。 [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]
    

1 个答案:

答案 0 :(得分:2)

试试这个:

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)