Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么Access会按表分解联接查询,然后分别将每个查询传递给ODBC(SQL Server)?_Sql Server_Ms Access_Join - Fatal编程技术网

Sql server 为什么Access会按表分解联接查询,然后分别将每个查询传递给ODBC(SQL Server)?

Sql server 为什么Access会按表分解联接查询,然后分别将每个查询传递给ODBC(SQL Server)?,sql-server,ms-access,join,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个不同的作业(会话) Microsoft Access(应用程序)使用Access数据库引擎(也称为“ACE”,以前称为“Jet”)处理其查询。因此,它倾向于将表视为离散实体,就像SQLServer查询引擎处理自己的表一样。(您可以要求SQL Ser

为什么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个不同的作业(会话)

Microsoft Access(应用程序)使用Access数据库引擎(也称为“ACE”,以前称为“Jet”)处理其查询。因此,它倾向于将表视为离散实体,就像SQLServer查询引擎处理自己的表一样。(您可以要求SQL Server从
表1内部联接表2
获取信息,但在查询的低级处理过程中,SQL Server引擎必须从各个表中提取数据。)

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

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

  • [t1]是一个本地访问表
  • [t2]是SQL Server上的ODBC链接表,并且
  • [t3]是CSV文件中的数据表
ACE可以处理这些类型的查询,但它只能通过适应一般情况来实现,这可能会以针对特定情况(如您的情况)进行优化为代价

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

  • 在Access中创建,或
  • 为该查询创建SQL Server视图,然后使用ODBC链接到该视图的“表”(而不是链接到单个SQL Server表)

  • 可能是因为访问不是SQL。它使您能够编写非常相似的代码。但是更高级的东西需要分解成更小的块。很好的答案(+upvote),正如您所注意到的,这些ODBC表可以来自不同的数据源。奇怪的是,一些通过ODBC的“怪物”8+大表查询在访问SQL server的过程中几乎即时起作用——我试图找出JET用于将连接拆分为所选连接的条件,因为有些查询工作得非常好。通常代替传递的方法是将sql保存为视图sql端并链接到该端。这允许使用sql studio工具编辑/修改本机t-sql。与pass-through(read-only)@AlbertD.Kallal相比,这个简单的链接表不仅过滤效果很好,而且可以更新。非常感谢您的评论。我已经更新了我的答案。很高兴知道!SQL Server对链接服务器执行相同的操作。。。在编写查询时必须非常小心。
    session 1:   Select a from t1
    Session 2.   select b from t2
    session 3.   select c from t3