跨多个访问数据库的内部连接

Posted

技术标签:

【中文标题】跨多个访问数据库的内部连接【英文标题】:Inner join across multiple access db's 【发布时间】:2010-09-12 03:59:14 【问题描述】:

我正在为我非常不喜欢的 ASP.NET CMS 重新设计一个应用程序。我在性能上做了一些改进,却发现这个 CMS 不仅使用 MS SQL,而且一些用户“简单地”使用 MS Access 数据库。

问题是我有一些内部连接的表,MS Access 版本位于两个不同的文件中。我不能简单地将表移动到另一个 mdb 文件。

我现在正试图找出一种跨多个访问数据库文件“内部连接”的好方法?

如果我已经获取所有数据并以编程方式进行操作,那真是太可惜了!

谢谢

【问题讨论】:

【参考方案1】:

您根本不需要链接表。有两种方法可以使用来自不同 MDB 的数据,无需链接表即可使用。第一种是在 SQL 的 FROM 子句中使用“IN 'c:\MyDBs\Access.mdb'”。您保存的查询之一是:

SELECT MyTable.*
FROM MyTable IN 'c:\MyDBs\Access.mdb'

另一个保存的查询是:

SELECT OtherTable.*
FROM OtherTable IN 'c:\MyDBs\Other.mdb'

然后您可以保存这些查询,然后使用保存的查询连接两个表。

或者,您可以通过在 FROM 子句中为每个表指定源 MDB 的路径,在单个 SQL 语句中管理所有这些:

SELECT MyTable.ID, OtherTable.OtherField
FROM [c:\MyDBs\Access.mdb].MyTable 
  INNER JOIN [c:\MyDBs\Other.mdb].OtherTable ON MyTable.ID = OtherTable.ID

但请记住一件事:

Jet 查询优化器不一定能够使用这些表中的索引进行连接(是否将它们用于单个字段的标准是另一个问题),因此这可能非常慢(在我的测试中,不是,但我没有使用大数据集进行测试)。但这个性能问题也适用于链接表。

【讨论】:

哇。您多久说一次您今天学到了有关 Access 的新知识?我已经好几年没用过 Access了,但是当时意识到这一点简单的知识可以为我节省多少时间,这让我很痛苦。 很遗憾Jet 数据库引擎的名声如此糟糕,因为它确实是一个了不起的引擎。它能够(同时)连接如此多不同类型的数据并就优化数据检索做出明智的决策,这是任何其他平台都无法比拟的。【参考方案2】:

如果您有权访问 MDB,并且能够更改它们,则可以考虑使用链接表。 Access 提供了链接到外部数据(在其他 MDB、Excel 文件中,甚至在 SQL Server 或 Oracle 中)的能力,然后您可以针对这些链接执行联接。

我强烈建议对此类选项进行性能测试。如果将 Access 数据库的用户迁移到另一个系统(甚至是 SQL Express)是可行的,那也是可取的——上次我检查过,不再有 64 位的 ODBC JET 驱动程序,所以如果应用程序曾经托管在在 64 位环境下,这些用户将被淹没。

【讨论】:

您确定可以使用来自不同数据库的表来实现关系吗?我不确定在这种情况下 INNER JOIN 指令是否会成功(事实上我相信你会得到一个错误!) 是的,从 Windows 3.1 版本开始,Access 就允许链接表之间的任意关系。但是,它通常会即时获取整个表,这对于大表来说可能是个问题。【参考方案3】:

在一个访问数据库中,您可以创建指向另一个数据库的“链接表”。您应该(我认为)能够查询这些表,就好像它们都存在于同一个数据库中一样。

这确实意味着您必须更改其中一个数据库来创建虚拟表,但至少您实际上并没有移动数据,只是创建了一个指向它的指针

【讨论】:

【参考方案4】:

在 Access 中,您可以通过“链接表管理器”添加远程表。您可以将链接添加到一个或另一个 Access 文件,或者您可以创建一个引用两个文件中的表的新 Access 文件。完成此操作后,内部连接查询与在单个数据库中执行它们没有什么不同。

【讨论】:

以上是关于跨多个访问数据库的内部连接的主要内容,如果未能解决你的问题,请参考以下文章

GWT RPC:跨多个请求使用相同的数据库连接

跨多个服务器访问不同数据库的表的方法

如何跨多个命名空间C#定义和访问嵌套字典数据[重复]

在同一连接中跨函数调用访问数据

finereport怎样跨数据库查询

MySQL ORDER BY 跨多个连接表的列