【问题标题】:What is wrong with this SQL Server query [duplicate]此 SQL Server 查询有什么问题[重复]
【发布时间】:2018-09-23 17:14:01
【问题描述】:

以下更新查询有什么问题?它给出了语法错误,错误信息如下:

消息 102,第 15 级,状态 1,第 1 行
'a' 附近的语法不正确。

代码:

UPDATE D_date a 
SET d_date_key = b.d_date_key,  
    full_date = b.full_date,    
    day_of_week = b.day_of_week,    
    day_of_week_display = b.day_of_week_display,    
    fiscal_day_number = b.fiscal_day_number 
FROM   
    dbo.[2017 Calendar update] b
WHERE  
    a.d_date_key = b.d_date_key;

【问题讨论】:

  • 错误很明显是Incorrect syntax near 'a' 第一行。
  • 问这样的问题时,也许首先要问/回答:为什么你认为它起作用?基于其他一些 SQL 方言,或者随机猜测,还是什么?但可能不是基于阅读 SQL Server 关于语法的文档,这将是在发布之前查看的明智之处。

标签: sql sql-server


【解决方案1】:

您不在UPDATE 子句中为要更新的表设置别名,而是在FROM 中设置别名。正确的语法是:

UPDATE a
SET d_date_key =b.d_date_key ,  
    full_date=b.full_date,  
    day_of_week=b.day_of_week,  
    day_of_week_display=b.day_of_week_display,  
    fiscal_day_number=b.fiscal_day_number   
FROM D_date a
     JOIN dbo.[2017 Calendar update] b ON a.d_date_key = b.d_date_key;

但是,在升序字母字符中使用别名(abcd)或类似想法(如T1T2T3)是不好的做法等),因为它们对每个人都毫无意义。使用适当的别名。比如D对应D_DateCU对应2017 Calendar update

【讨论】:

    【解决方案2】:

    显然,SQL Server 中 update 语句的 update 部分中不允许使用别名。而是只使用表名:

    UPDATE D_date 
        SET d_date_key = b.d_date_key ,  
            full_date = b.full_date,  
            day_of_week = b.day_of_week,  
            day_of_week_display = b.day_of_week_display,  
            fiscal_day_number = b.fiscal_day_number   
        FROM  dbo.[2017 Calendar update] b
        WHERE D_date.d_date_key = b.d_date_key;
    

    或者使用明确的JOIN 和合理的别名:

    UPDATE D_date 
        SET d_date_key = cu.d_date_key ,  
            full_date = cu.full_date,  
            day_of_week = cu.day_of_week,  
            day_of_week_display = cu.day_of_week_display,  
            fiscal_day_number = cu.fiscal_day_number   
        FROM D_date d JOIN
             dbo.[2017 Calendar update] cu
             ON d.d_date_key = cu.d_date_key;
    

    【讨论】:

    • 我不知道是谁投了反对票,但这是正确的,谢谢。
    • @EricBrandt Gordan 提供的第二个 SQL 确实有效。您可以在FROM 中为表命名,但在UPDATE 子句中使用它的实际名称。但是,我相信在 T-SQL 中它被认为是不好的做法。我认为在过去的版本中它可能会导致奇怪的行为;因为UPDATE 子句中命名的表可能被视为与FROM 中引用的对象不同的对象。就像你有一个像FROM Table1 T1, Table1 这样的子句。 Table1.Col1 将引用第二个表。我认为在旧版本的 SQL Server 中也会发生同样的情况(对于更新的版本不太确定)。
    • @Larnu 。 . .您可以FROM 中使用别名,并在UPDATE 中使用表名。效果是一个完整的笛卡尔积,这通常不是我们想要的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2012-06-22
    • 1970-01-01
    • 2011-10-25
    • 2014-12-27
    相关资源
    最近更新 更多