2013-08-04 4 views
2

전체 상황을 설명해 드리겠습니다 : 아래 두 개의 테이블이 있습니다. Module 테이블 MaxTestCasesExecutedBySingleUserTotalTestCasesExecutedByAllUser의 값은 일부 집계 절을 사용하여 갱신 될 필요 파라미터로서 Name (행 ModuleMember 테이블) 소요의 NameTestCasesExecutedByTheUser의 값을 반환하는 함수 dbo.GetValue 소중한 다른 테이블이UPDATE 문의 집합 목록에서 집계를 사용하는 방법

CREATE TABLE [dbo].[Module](
    [ProjectID] [int] NOT NULL, 
    [ModuleID] [int] NOT NULL, 
    [ModuleName] [nvarchar](100) NOT NULL, 
    [MaxTestCasesExecutedBySingleUser] [int] NULL, 
    [TotalTestCasesExecutedByAllUser] [int] NULL, 
    PRIMARY KEY ([ProjectID],[ModuleID])) 

CREATE TABLE [dbo].[ModuleMember](
    [ProjectID] [int] NOT NULL, 
    [ModuleID] [int] NOT NULL, 
    [SerialNo] [int] NOT NULL, 
    [Name] [nvarchar](100) NOT NULL, 
    PRIMARY KEY ([ProjectID],[ModuleID],[SerialNo])) 

Insert Into Module Values (1,1,'Installation_Test',null,null) 
Insert Into Module Values (1,2,'Server_Test',null,null) 
Insert Into Module Values (1,3,'Client_Test',null,null) 
Insert Into Module Values (1,4,'Security_Test',null,null) 

Insert Into ModuleMember Values(1,1,0,'Jim') 
Insert Into ModuleMember Values(1,1,1,'Bob') 
Insert Into ModuleMember Values(1,2,0,'Jack') 
Insert Into ModuleMember Values(1,2,1,'Steve') 
Insert Into ModuleMember Values(1,2,2,'Roy') 
Insert Into ModuleMember Values(1,2,3,'Jerry') 
Insert Into ModuleMember Values(1,3,0,'Root') 
Insert Into ModuleMember Values(1,3,1,'Tom') 
Insert Into ModuleMember Values(1,4,0,'Evil') 

테이블의 형태. Module 테이블에서이 두 값을 업데이트해야합니다.

정의 :

MaxTestCasesExecutedBySingleUser = 테스트 케이스는 모듈의 부재에 의해 실행되는 경우, 최대 개수

TotalTestCasesExecutedByAllUser = 모듈의 모든 부재에 의해 실행되는 테스트 케이스의 총 수.

나는 쿼리 아래 시도했지만 그것은 나에게 오류 던지고있다 : An aggregate may not appear in the set list of an UPDATE statement.

UPDATE M 
SET 
M.MaxTestCasesExecutedBySingleUser = MAX(N.TestCasesExecutedByTheUser), 
M.TotalTestCasesExecutedByAllUser = SUM(N.TestCasesExecutedByTheUser) 
FROM Module M 
JOIN ModuleMember Mem ON (M.ProjectID = Mem.ProjectID AND M.ModuleID = Mem.ModuleID) 
CROSS APPLY dbo.GetValue(Mem.Name) N 

답변

2

가 나는 apply

,747를 사용하는 완벽한 경우 생각
2

해결 방법은 좀 더 자세한입니다 - 먼저 집계를 얻을 수있다 (을 예 CTE에서), 그리고 다음 갱신 대상 테이블 :

;WITH src AS 
(
    SELECT 
    Mem.ProjectID, 
    Mem.ModuleID, 
    mtc = MAX(N.TestCasesExecutedByTheUser), 
    stc = SUM(N.TestCasesExecutedByTheUser) 
    FROM dbo.ModuleMember AS Mem 
    CROSS APPLY dbo.GetValue(Mem.Name) AS N 
    GROUP BY Mem.ProjectID, Mem.ModuleID 
) 
UPDATE M 
    SET M.MaxTestCasesExecutedBySingleUser = src.mtc, 
     M.TotalTestCasesExecutedBySingleUser = src.stc 
FROM dbo.Module AS M 
INNER JOIN src 
ON M.ProjectID = src.ProjectID 
AND M.ModuleID = src.ModuleID; 
+0

큰 해결 방법 .... + 1 – SKJ

관련 문제