[SQL] GROUP BY 후 연결하여 하나의 필드
SQLGROUP BY 후 연결하여 하나의 필드
이 질문은 SO에 여러 번 요청을받은하지만 답변을 아무도 내 상황에 만족하지 않습니다.
나는 120 만 주위의 고유 객체 (그리고 증가)에 대한 여러 버전을 포함하는 DataObjectVersions 테이블을 취급하고 있습니다. 나는 각각의 고유 한 개체에 대한 특정 필드에서 CONCATENATE 변경해야합니다.
지금 내가 Q3에서 XML 패스와 함께 솔루션을 발표 사용하지만,이 테이블에 이러한 쿼리를 실행하고하면 전체 성능 재해입니다. SQL Server는 1,900 후 데이터를 retun하기 시작했다. 이 데이터가보다 두 배 합류 될 것으로 알고, 당신은 영향을 상상할 수있다.
나는 (물론 키의하지 않은)는 다른 필드로 그룹화 다른 행의 같은 필드의 값을 연결하는 가장 효율적인 확장 성을 인식하는 방법을 찾고 있어요. 더 정확히 말하면, 이것은 데이터웨어 하우스에서보기 내에서 사용된다.
편집하다:
나는 설명을 단순화하기 위해 시도했지만 여기에 전체 개요입니다 나는 다음과 같은 열이있는 여러 테이블을
[ID] [CreatedTime] [CreatedBy] [DeletedTime] [DeletedBy] [ResourceId] [AccountId] [Type]
전망은 여전히 같은 열을 반환하는 모든 테이블의 모든 레코드의 조합을 반환하는 데 사용됩니다 (버전 테이블이 내 질문에 설명). [의 ResourceId] 및 [통해 AccountId (즉 그룹 구성원 시스템 계정 등의 자원 할당) 오브젝트의 고유 식별자를 합성한다. 에서 [유형]이 서로 다른 수준의 식별하는 데 사용됩니다 (읽기 / 쓰기 등으로 / 과제 파일의 경우 실행)
다른 모든 필드는 다른 고유 한 객체 (다른 테이블에서) 동일한 값이 포함되어 있습니다. 나는 개체를 얻고 [유형] 열의 값을 연결해야합니다. 전체 (다른 유형이 존재하지 않는 경우)를 행 이후 처리하고 ([의 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.이 시도:
이 시도:
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)
from https://stackoverflow.com/questions/13647394/concatenate-one-field-after-group-by by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] DECIMAL에 VARCHAR (0) | 2020.07.09 |
---|---|
[SQL] 하나 개의 레코드로 쿼리를 제한하면 성능을 향상합니까 (0) | 2020.07.09 |
[SQL] 바로 단어를 검색 MYSQL | 철자 오류를 수정 (0) | 2020.07.09 |
[SQL] 데이터는 SQL 테이블에 영구적으로 저장되지 (0) | 2020.07.09 |
[SQL] SQL은 - 주로 주문 순차적으로 직렬 INT 값 누락 찾기 (0) | 2020.07.09 |