sql - 如何在 UPDATE 语句的集合列表中使用聚合

标签 sql sql-server tsql

让我描述一下整个情况:我有下面两个表。 Module 表中 MaxTestCasesExecutedBySingleUserTotalTestCasesExecutedByAllUser 的值需要使用一些聚合子句进行更新

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 = 模块中所有成员执行的测试用例总数。

我尝试了以下查询,但它向我抛出错误:聚合可能不会出现在更新语句的集合列表中。

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

最佳答案

解决方法有点冗长 - 您必须先获取聚合(例如在 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;

关于sql - 如何在 UPDATE 语句的集合列表中使用聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18038738/

相关文章:

php - MySQL 用 PHP 插入

sql - 区分联合表中的行

mysql - 如何查找一年内的标题变化

c# - int 和 string 之间的唯一索引

SQL Server - 如何创建 IF EXISTS...SELECT AND SELECT

SQL SUM 表达式和锁

sql - 对不同服务器/数据库中的表执行 UNPIVOT 失败,出现 'conflicts with the type of other columns' 错误

asp.net - SQL Server 停止十分钟

sql-server-2005 - 如何使用跨多个服务器链接的过程的事务?

sql - TSQL - 一些 |为什么它们相同但名称不同?