使用sql更新包含select查询结果的现有列

时间:2014-02-20 13:28:48

标签: sql sql-server select sql-update

我正在尝试使用从Number_Of_Marks语句中获得的结果更新Results表中名为SELECT的列。我们的select语句用于计算结果表中每个模块的标记数。 SELECT语句有效且输出正确,即

 ResultID   ModuleID   cnt
 -------------------------
   111      ART3452    2                                                          
   114      ART3452    2                                                         
   115      CSC3039    3                                                        
   112      CSC3039    3                                                        
   113      CSC3039    3 

使用的表格是:

结果:ResultID, ModuleID, Number_Of_Marks

我们需要将cnt的结果更新到我们的Number_Of_Marks列中。这是我们的代码......

DECLARE @cnt INT

SELECT @cnt

SELECT C.cnt
  FROM Results S
       INNER JOIN (SELECT ModuleID, count(ModuleID) as cnt
                     FROM Results 
                    GROUP BY ModuleID) C ON S.ModuleID = C.ModuleID

    UPDATE Results 
    SET [Number_Of_Marks] = (@cnt)

1 个答案:

答案 0 :(得分:4)

您可以使用update / join语法在SQL Server中执行此操作:

UPDATE s
  SET [Number_Of_Marks] = c.cnt
  FROM Results S INNER JOIN
       (SELECT ModuleID, count(ModuleID) as cnt
        FROM Results 
        GROUP BY ModuleID
       ) C
       ON S.ModuleID = C.ModuleID;

我假设您需要来自子查询的计数,而不是来自未初始化的变量。

编辑:

一般情况下,当您更改问题时,最好再提一个问题。但有时,变化实际上很小。修改后的查询类似于:

UPDATE s
  SET [Number_Of_Marks] = c.cnt,
      Marks = avgmarks
  FROM Results S INNER JOIN
       (SELECT ModuleID, count(ModuleID) as cnt, avg(marks * 1.0) as avgmarks
        FROM Results 
        GROUP BY ModuleID
       ) C
       ON S.ModuleID = C.ModuleID;

请注意,我将marks乘以1.0。这是将整数转换为数值的快速方法。 SQL Server取整数的平均值并生成一个整数。通常你想要某种十进制或浮动值。