sql-server - 为什么 Access 按表分解 JOIN 查询,然后将每个查询分别传递给 ODBC (SQL Server)?

标签 sql-server ms-access join

为什么 Access 2013 会采用如下完美查询:

Select t1.A,t2.b,t3.c
from T1
Inner Join t2 on t2.a = t1.a
Inner Join t3 on t3.a = t1.a

并将其分解为 3 个不同的作业( session )

session 1:   Select a from t1
Session 2.   select b from t2
session 3.   select c from t3

最佳答案

Microsoft Access(应用程序)使用 Access 数据库引擎(又名“ACE”,以前的“Jet”)来处理其查询。因此,它倾向于将表视为离散实体,就像 SQL Server 查询引擎对其自己的表所做的那样。 (您可能会向 SQL Server 请求来自 Table1 INNER JOIN Table2 的信息,但在查询的低级处理过程中的某个时刻,SQL Server 引擎必须从各个表中提取数据。)

在您的特定情况下,当所有三个表都在 SQL Server 中时,ACE 会分别从每个表中提取信息,这似乎令人费解,并且将整个查询传递给 SQL Server 进行处理可能会更加有效。然而,给定的 ODBC 链接表可以由任意数量的“数据库技术”支持,这些技术具有广泛不同的功能和互操作性程度。

例如,您的查询可能很容易出现以下情况:

  • [t1] 是本地 Access 表,
  • [t2] 是 SQL Server 上的 ODBC 链接表,并且
  • [t3] 是 CSV 文件中的数据表。

ACE 可以处理这些类型的查询,但它只能通过适应一般情况才能做到这一点,而这可能会以牺牲针对特定情况(例如您的情况)的优化为代价。

如果您确实需要在 SQL Server 上运行整个查询,那么您始终可以

  1. 创建 pass-through query在 Access 中,或者
  2. 为该查询创建一个 SQL Server VIEW,然后使用 ODBC 链接“表”到该 VIEW(而不是链接到各个 SQL Server 表)。

关于sql-server - 为什么 Access 按表分解 JOIN 查询,然后将每个查询分别传递给 ODBC (SQL Server)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193302/

相关文章:

sql-server - SQL Server 数据透视查询仅返回一行

mysql - 将access 2007链接到mysql

mysql - 仅选择第二个表中不存在的记录

sql - MySQL从多个选项中加入以选择一个值

java - Java 中 SQL Server PreparedStatement 的错误结果

mysql - .NET + MySQL(或替代的基于 SQL 的数据库)是一个不错的选择吗?

sql-server - 如何找到连接字符串的 ODBC 驱动程序名称?

SQL转1个字段,多条记录变成1条记录多字段

database - 如何创建表单来编辑一对多关系?

php - MySQL 查询执行时间过长。查询返回良好结果,但可能设计不佳