Sql server 为什么Access会按表分解联接查询,然后分别将每个查询传递给ODBC(SQL Server)?
为什么Access 2013会接受一个非常好的查询,如: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
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文件中的数据表
可能是因为访问不是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