2013-08-04 70 views
2

讓我來描述整個情況:我有兩個以下的表格。需要使用一些骨料子句進行更新的MaxTestCasesExecutedBySingleUserTotalTestCasesExecutedByAllUserModule表中的值如何在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') 

有值函數dbo.GetValue另一個表這需要Name(從ModuleMember表)作爲參數,並在返回的NameTestCasesExecutedByTheUser值表格的形式。我需要在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

完善的情況下,
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

相關問題