在 VBA 中优化 SQL 查询

Optimize SQL query in VBA

我正在尝试找到最优化的方法来执行此操作,该操作在 Access-VBA 中运行 SQL 语句:

SQl = "UPDATE " _
& "MainTable As T1 " _
& "INNER JOIN TableOfLists As T2 " _
& "ON (T2.SecondList = T1.MultiValuedList.value) " _
& "Set [FOUND IN LISTS] = 'YES' "
DoCmd.RunSQL SQl

SQl = "UPDATE " _
& "MainTable As T1 " _
& "INNER JOIN TableOfLists As T2 " _
& "ON (T2.FirstList = T1.MultiValuedList.value) " _
& "Set [FOUND IN LISTS] = 'YES' "
DoCmd.RunSQL SQl

此代码有效,肯定可以改进,但我没能找到方法。

到目前为止我已经尝试过的以及我得到的结果:

  1. Adding 2 INNER JOIN 但我收到语法错误 3075
  2. Adding 2 conditions separated by an OR in the INNER JOIN condition 但我收到错误 3081:不能加入超过 1 个 table
  3. This was my previous solution using 2 SELECT statements 但我 建议改为使用 JOIN

欢迎提出任何建议!

给你。这是一种 ANSI SQL 做事方式,因为不支持更新内的连接。 (有关详细信息,请参阅 this blog entry。)这就是您在第一种方法中看到错误的原因(使用两个 INNER JOIN,因为 Access/Jet 在其 UPDATE 语法中为您提供了一个特殊功能,但它不是完全开发为 vanilla SQL 是。你的第二种方法(在连接条件中使用 OR)会出错,因为 Access/Jet 对连接条件中的条件的支持非常有限(你不会看到这个例如,在 Oracle 或 Postgres 中)。事实证明,你的第三种方法(有两个选择,但使用 IN 而不是 EXISTS)是相同的,在引擎盖下。所以告诉你使用连接的人是消息灵通的:)。

UPDATE MainTable SET [FOUND IN LISTS]='YES'
WHERE 
    EXISTS (SELECT 1 FROM TableOfLists WHERE FirstList=MainTable.[value])
    OR
    EXISTS (SELECT 1 FROM TableOfLists WHERE SecondList=MainTable.[value]);

Example in Access