【问题标题】:How does MS Access join linked tables (linked to the same SQL server database)?MS Access 如何连接链接表(链接到同一个 SQL Server 数据库)?
【发布时间】:2010-09-25 18:58:20
【问题描述】:

只要每个表都链接到同一个 SQL Server 数据库中的表,我就有带有链接表的 MS Access 数据库。我在 Access 中有一个查询,它连接两个表(特别是我正在使用连接更新基于另一个表的表)。

问题是 Access 在进行联接之前会“下载”所有表数据吗?还是很聪明并在 SQL Server 上加入它?

查询是:

UPDATE TBL_INVOICE_CHARGES INNER JOIN TBL_ANI 
ON  (TBL_INVOICE_CHARGES.CH_CUST_ID = TBL_ANI.ANI_CUST_ID) 
AND (TBL_INVOICE_CHARGES.CH_ANI = TBL_ANI.ANI_NZ_ANI) 
SET TBL_INVOICE_CHARGES.ANI_NOTES = TBL_ANI.ANI_NOTES;

【问题讨论】:

    标签: ms-access join


    【解决方案1】:

    根据 Albert D. Kallal(Access MVP)的说法,Access 不会拉取整个表,但复杂视图除外,因为这些视图可能会搞砸。但是,最好使用服务器上的视图并链接到视图,或者使用传递查询。

    更多信息:How to create an SQL pass-through query in Access

    【讨论】:

      【解决方案2】:

      Jet 很可能会将整个事情交给 SQL Server,SQL Server 将执行索引连接,然后执行更新。换句话说,对于像您的示例这样的简单查询,它全部在服务器上完成,没有一个字节通过网络拉出用于本地处理。

      让 Jet 拉整张桌子很容易。最简单的方法是将 Access 表达式放在 WHERE 子句中。这是一个会导致它发生的示例:

         WHERE Format(MyDate,"YYYY") = 2008
      

      必须拉出整个表格,以便 Access 可以对表格中的所有日期运行 Format() 函数。此外,它不能使用任何索引,因此会非常慢。使用 Jet 后端也会很慢,仅仅是因为它效率太低。编写此 WHERE 子句的正确方法是:

         WHERE MyDate Between #1/1/2008# And #12/31/2008#
      

      如果您在已保存的 Access 查询中写入,它将被移交给 SQL Server 进行处理(如果您的后端数据库引擎使用的分隔符与 Jet SQL 使用的分隔符不同,则 ODBC 将发送适当的分隔符)。

      但是,如果您不这样做,则不太可能遇到通过网络传输过多数据的问题。事实上,Jet 非常聪明,并且在通过网络发送尽可能多的查询以进行处理方面做得非常好。例如,如果您在 SELECT 语句中调用 Access 函数,则不带 Access 函数的底层选择将被发送到服务器,然后这些函数将在 Access 中对结果集执行。对于此访问查询:

         SELECT Format(MyDate,"MM-DD")
         FROM MyTable
         WHERE MyDate Between #1/1/2008# And #12/31/2008#
      

      Jet 会将其发送到服务器:

         SELECT MyDate
         FROM MyTable
         WHERE MyDate Between #1/1/2008# And #12/31/2008#
      

      一旦 Jet 从服务器接收到符合条件的行,它只会使用 Access Format() 函数格式化日期字段。这也适用于 JOIN,尤其是索引字段上的连接(尽管非索引字段连接也可能会移交给服务器)。

      现在,有时 Jet 确实猜错了,最终效率低得令人难以置信。在这些情况下,您可以在服务器上设置视图和存储过程,并使用直通查询来确保避免 Jet 的错误猜测。

      【讨论】:

        【解决方案3】:

        我查看了 SQL Profiler(不幸的是我手边没有实际的日志),这是我发现的:

        • 它从两个表中选择所有记录
        • 为一张表中的每条记录调用一次 UPDATE 所以这会很慢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-30
          • 2010-12-10
          相关资源
          最近更新 更多