跨多个访问数据库的内部联接
我正在重新设计一个我真的不喜欢的ASP.NET CMS应用程序。我对性能进行了一定的改进,只是发现不仅此CMS使用MS SQL,而且某些用户"仅"使用MS Access数据库。
问题是我内部连接了一些表,MS Access版本的表位于两个不同的文件中。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。我不能简单地将表移动到另一个mdb文件。
我现在正在尝试找出跨多个访问db文件"内部联接"的好方法吗?
如果我已获取所有数据并以编程方式进行操作,那真是可惜!
谢谢
解决方案
如果我们有权访问MDB,并且能够更改它们,则可以考虑使用链接表。 Access提供了链接到外部数据的能力(在其他MDB中,在Excel文件中,甚至在SQL Server或者Oracle中),然后我们可以对链接执行联接。
我强烈建议我们进行性能测试这样的选择。如果将Access数据库的用户迁移到另一个系统(甚至是SQL Express)是可行的,那也将是更好的选择-最后我检查了,不再有用于ODBC的64位JET驱动程序,因此,如果该应用程序托管在在64位环境中,这些用户将被抽空。
在一个访问数据库中,我们可以创建指向另一个数据库的"链接表"。我们(我认为)应该能够查询表,就好像它们都存在于同一数据库中一样。
这确实意味着我们必须更改一个数据库才能创建虚拟表,但是至少我们实际上并没有移动数据,只是创建了一个指向它的指针。
在Access中,我们可以通过"链接表管理器"添加远程表。我们可以将链接添加到一个Access文件或者另一个Access文件中,或者可以创建一个新的Access文件,该文件引用两个文件中的表。完成此操作后,内部联接查询与在单个数据库中进行查询没有什么不同。
我们根本不需要链接表。有两种使用来自不同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查询优化器不一定能够将这些表中的索引用于联接(是否将其用于各个字段的条件是另一个问题),因此这可能会非常慢(在我的测试中,不是,但我没有使用大型数据集进行测试)。但是该性能问题也适用于链接表。