我的带有 JOIN 的 UPDATE 的 SQL 语法有啥问题?

Posted

技术标签:

【中文标题】我的带有 JOIN 的 UPDATE 的 SQL 语法有啥问题?【英文标题】:What is wrong with my SQL syntax for an UPDATE with a JOIN?我的带有 JOIN 的 UPDATE 的 SQL 语法有什么问题? 【发布时间】:2011-01-29 13:17:58 【问题描述】:

我有两个表,通过一个公共键相关联。所以 TableA 有键 AID 和值 Name 而 TableB 有键 AID、BID 和值 Name、Value:

AID Name
74  Alpha

AID BID Name  Value
74  4   Beta  Brilliance

我想仅使用名称字段将此处的 TableB 值从 Brilliance 更新为 Barmy。我以为我可以通过包含 JOIN 的 UPDATE 来做到这一点,但是 Access(我知道......)抱怨“查询表达式中的语法错误(缺少运算符)”,然后是“Barmy”中的所有内容:

UPDATE tB
SET tB.Value='Barmy'
FROM `TableB` tB
INNER JOIN `TableA` tA
  ON tB.AID=tA.AID
WHERE tB.Name='Beta'
  AND tA.Name='Alpha';

我犯了什么滔天罪行?还是只是 Access 不符合?

【问题讨论】:

【参考方案1】:

一种解决方案是用 Hoyle ANSI 编写(它不识别 UPDATE 语句中的 FROM 子句):

UPDATE TableB
SET BValue="Barmy"
Where Name="Beta"
    And Exists( Select 1 
                From TableA As TA 
                Where TA.Name = "Alpha"
                    And TA.AID = TableB.AID );

最后一个补充,Access 在 UPDATE 语句中处理 JOINS,方法是将它们放在 UPDATE 子句中,如下所示:

UPDATE TableB
    INNER JOIN TableA tA
        ON TableB.AID=tA.AID    
SET TableB.BValue="Barmy"
WHERE TableB.Name="Beta"
  AND tA.Name="Alpha";

编辑另外一项,Access 使用双引号来标识字符串,而不是单引号。

【讨论】:

感谢 Thomas 的快速响应,但我刚刚尝试用反引号中的原始表名替换所有别名,但我得到了同样的错误。还有其他想法吗? Access不支持UPDATE...FROM,但是可以加入声明。请参阅 Martijn 的回答。 Jet/ACE SQL 也不支持反引号。它们对 Jet/ACE 没有任何意义。【参考方案2】:

在您了解FROM 行中的别名之前,它可能不知道tB 是什么。试试UPDATE TableB ....

【讨论】:

我已经尝试用反引号中的表名替换所有别名,但仍然没有骰子。 如其他cmets所说,Access不支持UPDATE...FROM,但可以加入声明。请参阅 Martijn 的回答。【参考方案3】:

老实说,我已经好几年没碰 ACCESS(幸运的是)this thread 似乎表明这是正确的语法。

UPDATE TableB tB
SET tB.BValue='Barmy'
INNER JOIN TableA tA
  ON tB.AID=tA.AID
WHERE tB.Name='Beta'
  AND tA.Name='Alpha';

【讨论】:

+1。 Access 不像 SQL Server 那样做UPDATE...FROM,但它确实在更新中支持JOINs(老实说,无论如何,这更有意义,IMO)【参考方案4】:

我认为,基于测试:

UPDATE TableB tB
INNER JOIN TableA tA
  ON tB.AID=tA.AID
SET tB.Value='Barmy'
WHERE tB.Name='Beta'
  AND tA.Name='Alpha';

【讨论】:

【参考方案5】:

奇怪的是,我发现答案是使用隐式 JOIN:

UPDATE `TableA`, `TableB` 
 SET `TableB`.Value = 'Barmy'
WHERE `TableA`.AID=`TableB`.AID
 AND `TableA`.Name='Alpha'
 AND `TableB`.Name='Beta';

【讨论】:

【参考方案6】:

Access 是否进行子查询?

UPDATE TableB
SET TableB.Value='Barmy'
WHERE TableB.AID = (SELECT TableA.AID WHERE TableA.Name='Alpha')

【讨论】:

Access 确实支持子查询,但在这种情况下应该没有必要。

以上是关于我的带有 JOIN 的 UPDATE 的 SQL 语法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL UPDATE SELECT with JOIN 出错

带有 INNER JOIN 的 UPDATE 未更新

SQL UPDATE with INNER JOIN

sql update_with_join.sql

markdown sql,update,join

带有“Group by”、“max”和“join”的 SQL 请求?