我的数据库位于 MS Access 中,可以通过 UCanAccess 驱动程序访问 DBeaver,它包含两个表,我将其称为
Table1
和 Table2
。我想根据 Table1
中的条目更新 Table2
,并且我尝试了在 StackOverflow 中找到的内容的许多变体,包括:
UPDATE [Table1]
SET [Table1].[Column1] = [Table2].[ThingsToUpdateTo]
WHERE [Table1].[Column2] = [Table2].[Reference];
我收到错误:
SQL 错误 [42501]:UCAExc:::5.0.1 用户缺乏权限或未找到对象:
[Table2].[ThingsToUpdateTo]
我尝试仅在 SET 行中使用 SELECT 语句,这会在下一行中给出相同的错误,并且我尝试在 SET 和 WHERE 中使用 SELECT 语句。我还尝试将
[Table1]
和 [Table2]
放在 UPDATE 行中。
我觉得一定有一些非常简单的东西我错过了,导致我的声明无法引用
Table2
来更新Table1
。预先感谢!
我尝试仅在 SET 行中使用 SELECT 语句,这会在下一行中给出相同的错误,并且我尝试在 SET 和 WHERE 中使用 SELECT 语句。我还尝试将
[Table1]
和 [Table2]
放在 UPDATE 行中。这些解决了“用户缺乏权限”类型错误并引发“基数违规”错误。
尝试过
UPDATE Table1
INNER JOIN Table2 ON Table1.Column2 = Table2.Reference
SET Table1.Column1 = Table2.ThingsToUpdateTo;
这确实尝试更新记录,但我收到另一个错误:
意外令牌:需要 INNER:SET
我也尝试过:
UPDATE Table1
SET Column1 = Table2.ThingSToUpdateTo
FROM Table1
JOIN Table2 ON t1.Column2 = t2.Reference;
也尝试更新记录,但出现错误:
用户缺乏权限或未找到对象:t2.ThingsToUpdateTo
我还尝试在 Access 而不是 DBeaver 中运行所有这些查询,但没有成功。
正如 Erik 在对该问题的评论中提到的,UCanAccess 不使用 Access 数据库引擎。它使用 HSQLDB 处理 SQL 命令,并使用 Jackcess 将更改写回 Access 数据库文件。
因此,我们需要使用 ANSI 标准语法,而不是使用 Access 的非标准 UPDATE … JOIN 语法
UPDATE Table1 t1
SET Column1 = (
SELECT ThingsToUpdateTo FROM Table2 t2
WHERE t1.Column2 = t2.Reference
)
注意同时更新多列的语法是
UPDATE Table1 t1
SET (Column1, Comments) = (
SELECT ThingsToUpdateTo, Notes FROM Table2 t2
WHERE t1.Column2 = t2.Reference
)