2

状況全体を説明しましょう。以下の 2 つのテーブルがあります。MaxTestCasesExecutedBySingleUserおよびテーブルTotalTestCasesExecutedByAllUser内の値は、 ModuleAggregate 句を使用して更新する必要があります

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受け取り 、テーブルの形式で値を返す別のテーブル値関数があります。テーブル内のこれら 2 つの値を更新する必要があります。NameModuleMemberNameTestCasesExecutedByTheUserModule

意味:

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
4

2 に答える 2

4

回避策はもう少し冗長です。最初に (たとえば 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;
于 2013-08-04T01:12:06.520 に答える