【问题标题】:SQL Server update using three tables joinSQL Server 更新使用三表连接
【发布时间】:2021-08-06 22:05:19
【问题描述】:

我有一个现有的 Oracle 更新语句,我正在尝试将其转换为 SQL Server 更新语句。

我已经将 SQL 从 Oracle 函数转换为 SQL Server 函数,如下所示。

但是当我运行这个查询时,它无法理解 SQL 语句中的别名 a。它出错了

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

代码:

UPDATE related_opty_plan_n_dim a
SET a.days_to_create_interlock = (SELECT COUNT(*) 
                                  FROM date_dim b
                                  LEFT JOIN plan_n_dim p ON a.plan_key = p.plan_key
                                  WHERE b.cal_date >= CAST(p.createddate AS DATE)
                                    AND b.cal_date <= CAST(a.createddate AS DATE)
                                    AND b.weekday_flag = 'Y');

【问题讨论】:

  • 检查 SET 语句是否可以接收正在更新的列的别名。认为去掉“a”。 “SET a.days_to create_interlock ...”中的表别名可以解决你的问题。不能保证 - 但您只更新一个表,它不需要在 SET 构造的左侧使用别名。另一种选择可能是 UPDATE 语句的格式不符合 SQL Server 的语法规则。您可能需要使用 UPDATE x FROM (......) SET ... 语法。
  • 但我正在使用列与更新表中的第二个和第三个表连接。
  • 认为删除“a”。 “SET a.days_to create_interlock ...”中的表别名。只建议你删除那个单一的“a”。实例。没有其他人。请参阅@lptr 的回答。

标签: sql sql-server oracle


【解决方案1】:
update a
set days_to_create_interlock = (SELECT COUNT(*)…)
from related_opty_plan_n_dim as a

【讨论】:

  • 让我试试这个。看起来很有希望。这就是我玩的。
  • 这种格式是我一直在寻找的,我试图在加入之前将此表添加为一个。现在我明白我在最后添加了。谢谢。
  • ..@user13771510 .. 子查询中的左连接不是“左”连接,因为在 where 子句中引用了右表 (p) .. WHERE b.cal_date >= CAST (p.createddate AS DATE)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多