【问题标题】:Incorrect Syntax - SQL不正确的语法 - SQL
【发布时间】:2019-02-01 15:16:17
【问题描述】:

我正在尝试使用子查询更新表tbl_prev_data 中的两个字段,因为我必须使用聚合SUM。但是我不知道为什么会这样说

't' 附近的语法不正确`

其中t 是一个保存子查询结果的临时变量。我错过了什么吗?以下是我的查询。

UPDATE tbl_prev_data
SET Original_Value = t.Original_Value 
SET Pre_Val = t.PreWDV
FROM tbl_prev_data 
INNER JOIN 
    (SELECT 
         Asset_Group_Code, 
         ISNULL(SUM(Original_Value),0) AS 'Original_Value', 
         ISNULL(SUM(Prev_Val),0) AS 'PreWDV' 
     FROM 
         tbl_Asset_Master 
     GROUP BY 
         Asset_Group_Code, DOP 
     HAVING 
         (YEAR(DOP) != YEAR(GETDATE()) AND MONTH (DOP) > 3) t ON tbl_prev_data.Asset_Group_Code = t.Asset_Group_Code

【问题讨论】:

  • AND MONTH (DOP) > 3) 之后缺少一个括号,该括号在 select 之前开始
  • @Jens,谢谢。我真的没有注意到。这是一个真正的救生员。谢谢:)
  • 由于您没有在 aggregated 列上使用条件,因此您应该使用 WHERE 而不是 HAVING

标签: sql sql-server-2008 sql-update subquery inner-join


【解决方案1】:

你只需要指定SET一次

UPDATE tbl_prev_data
    SET Original_Value = t.Original_Value, 
        Pre_Val = t.PreWDV
FROM tbl_prev_data INNER JOIN ...

除此之外,您还需要从HAVING 子句中删除多余的左括号:

HAVING (YEAR(DOP) != YEAR(GETDATE()) AND MONTH (DOP) > 3
-------^

【讨论】:

  • 嘿,谢谢,但它似乎仍然显示相同的错误。
【解决方案2】:

右括号似乎有问题。 (SELECT Asset_Group_Code, ...t之前没有用)关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2017-02-07
    • 1970-01-01
    • 2018-06-26
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多