为什么此查询在 ODBC table 上 运行 时失败但在本地 tables 上工作?

Why does this query fail when running on ODBC table but work on local tables?

我有一个 MainUserTable,我正在尝试用一个 NewUserTable 更新它,其中包含所有新用户和为现有用户更改的任何数据。

我有一个 SQL 查询 运行 在 access 2013 数据库中更新 MainUserTable,它是一个 ODBC 连接的 Access 网络应用程序 table。如果新用户不存在,它应该添加新用户,并为 table 中已经存在的用户更新任何已更改的数据。

UPDATE NewUserTable 
       LEFT JOIN MainUserTable ON NewUserTable.Username = MainUserTable.Username 
       SET MainUserTable.[First Name] = [NewUserTable].[First Name] 

这在我 运行 在本地 tables 上按预期工作,为新用户创建新记录并更新现有用户,但是当它 运行 针对 ODBC table 我收到以下错误:

ODBC--call failed.
[Microsoft][ODBC Driver Manager] - Invalid argument value (#0)

只有在 NewUserTable 中有新用户时才会出现此错误;即 NewUserTable.UsernameMainUserTable.Username 不匹配的记录。如果它没有插入任何新记录,仅更新记录就可以正常工作。

您在这里所做的实际上与我期望 "update" 命令的工作方式相反。如果它打算根据需要插入一条记录,我希望 ANSI 将其称为 "updateorinsert" 或 "addupdate".

我会分两步进行。

  1. 插入 NewUserTable
  2. 中缺失的条目
  3. MainUserTable 的更新,使用 MainUserTableNewUserTable
  4. 的直接内部联接

您的代码在本地运行的原因可能是 MS 实施方式的产物 update。有点像当您可以更新或添加到绑定到连接两个表的表单的查询时。我不喜欢这种行为,因为对我来说,它何时起作用和不起作用的规则是神秘的。当您迁移到不同的数据库时,该模式不再有效,您必须重写代码或留住人员。