我的带有 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
,但它确实在更新中支持JOIN
s(老实说,无论如何,这更有意义,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 语法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章