SQL Update语句,需要帮助将值传递给子查询

时间:2013-07-14 13:48:06

标签: sql-server sql-server-2008-r2 sql-update subquery

这是我的SQL语句。它不起作用。

UPDATE dbo.Smoothie
SET TotalCalories = (SELECT 
                        SUM(CASE WHEN (Unit = 2) THEN f.Energ_Kcal * f.GmWt_2 * si.Quantity / 100 
                                 ELSE f.Energ_Kcal * f.GmWt_1 * si.Quantity / 100 
                            END) AS calories
                     FROM dbo.SmoothieIngredients AS si
                     INNER JOIN dbo.FoodAbbrev AS f ON si.FoodId = f.Id
                     WHERE si.SmoothieId = SmoothieId  ---> i want to pass the SmoothieId from the main update statement to the subquery.
                    )

我试着给它起一个名字S2,但仍然无效。

UPDATE dbo.Smoothie as S2
SET S2.TotalCalories = (SELECT 
                           SUM(CASE WHEN (Unit = 2) THEN f.Energ_Kcal * f.GmWt_2 * si.Quantity / 100 
                                    ELSE f.Energ_Kcal * f.GmWt_1 * si.Quantity / 100 
                                END) AS calories
                        FROM dbo.SmoothieIngredients AS si
                        INNER JOIN dbo.FoodAbbrev AS f ON si.FoodId = f.Id
                        WHERE si.SmoothieId = S2.SmoothieId)

1 个答案:

答案 0 :(得分:2)

您需要使用查询创建新表,然后将TotalCalories的值设置为列中的值。

所以在这种情况下:

UPDATE  dbo.Smoothie
SET     TotalCalories = s2.calories
FROM 
    ( SELECT    
         smoothieId,
         SUM(CASE WHEN (Unit = 2) THEN f.Energ_Kcal * f.GmWt_2 * si.Quantity / 100 
                                            ELSE f.Energ_Kcal * f.GmWt_1 * si.Quantity / 100 END) AS calories
         FROM      dbo.SmoothieIngredients AS si
         INNER JOIN dbo.FoodAbbrev AS f ON si.FoodId = f.Id
         GROUP BY SmoothieId
    ) AS s2
WHERE dbo.Smoothie.Id = s2.smoothieId

我的查询可能略有错误,但请在s2表的查询中记下Group By,然后将这些行与Where子句正常链接。