Access ODBC:不同数据库文件中表之间​​的JOIN

Posted

技术标签:

【中文标题】Access ODBC:不同数据库文件中表之间​​的JOIN【英文标题】:Access ODBC: JOIN between tables in different database files 【发布时间】:2016-01-20 09:17:28 【问题描述】:

假设我有多个表分布在不同的 Access 数据库文件 (*.mdb) 中,我想将这些表与“join”子句组合成一个数据集。目前我看到的唯一解决方案是在 Access 数据库中创建链接表,除非有人知道更好、更简洁的解决方案。

例如,我尝试过创建一个 SQL 语句,例如 SELECT * FROM tbl_a1 INNER JOIN [file_name].tbl_b1 ON [file_name].tbl_b1.pk=tbl_a1.fk WHERE 1,其中不支持“file_name”。

所以我使用 Microsoft Access 创建了一个链接表,它可以很好地与SELECT * FROM tbl_a1 INNER JOIN tbl_b1 ON tbl_b1.pk=tbl_a1.fk WHERE 1 配合使用。

我希望看到以编程方式创建它的解决方案,因为“机器 B”可能没有安装 Access,并且预定义的数据库文件还不包括链接表。这些表也不必是永久性的。 Microsoft 有一个documentation 如何仅使用 Microsoft Access 创建链接表,但它没有告诉我如何以编程方式进行。

注意:我正在使用带有 UniDac 的 RAD 10 Seattle/VCL C++ Builder 通过 ODBC 驱动程序进行数据库连接,因此 VBA 不是一个选项。

解决方案:在我的情况下,我必须为第二个表 SELECT * FROM tbl_a1 INNER JOIN [C:\path\db.mdb].tbl_b1 AS tbl_b1 ON tbl_b1.pk = tbl_a1.fk WHERE 1 设置表别名才能使其正常工作。感谢@Gord Thompson

【问题讨论】:

欢迎来到SO,请在提问时更具体一点:您尝试过什么,您期望什么等。请参阅how to ask 您可以在某个 mdb 中的一个“输出”聚合表中链接表,然后将您的应用程序连接到该表 你好@Nehal,我试过的东西是 f.e.在不支持“file_name”的情况下创建类似SELECT * FROM tbl-a1 INNER JOIN [file_name].tbl-b1 ON [file_name].tbl-b1.pk=tbl-a1.fk WHERE 1 的SQL 语句。因此,我使用 Microsoft Access 创建了一个链接表,它与SELECT * FROM tbl-a1 INNER JOIN tbl-b1 ON tbl-b1.pk=tbl-a1.fk WHERE 1 配合得很好。我希望看到一个以编程方式创建它的解决方案,因为“机器 B”可能没有安装 Access,并且预定义的数据库文件还不包括链接表。这些表也不必是永久性的。 您的应用程序是否使用实际的 Microsoft Access ODBC 驱动程序或 OLEDB 提供程序来访问数据库? @Gord Thompson ODBC 驱动程序 【参考方案1】:

如果您使用 Microsoft 自己的 Access ODBC 驱动程序,使用[mdbFileSpec].[tableName] 的方法应该可以工作。我无法在您的 C++ 环境中对此进行测试,但我可以确认使用 Python 和 pyodbc 这确实工作...

# -*- coding: utf-8 -*-
import pyodbc

connStr = (
    r"Driver=Microsoft Access Driver (*.mdb);"
    r"DBQ=C:\Users\Public\test\a1.mdb;"
    )
cnxn = pyodbc.connect(connStr)
sql = """\
SELECT *
FROM tbl-a1
INNER JOIN
[C:\\Users\\Public\\test\\b1.mdb].tbl-b1
    ON [C:\\Users\\Public\\test\\b1.mdb].tbl-b1.pk=tbl-a1.fk
WHERE 1
"""
crsr = cnxn.execute(sql)
for row in crsr:
    print(row)
crsr.close()
cnxn.close()

...但这很好用:

# -*- coding: utf-8 -*-
import pyodbc

connStr = (
    r"Driver=Microsoft Access Driver (*.mdb);"
    r"DBQ=C:\Users\Public\test\a1.mdb;"
    )
cnxn = pyodbc.connect(connStr)    
sql = """\
SELECT *
FROM [tbl-a1] AS tbl_a1
INNER JOIN
[C:\\Users\\Public\\test\\b1.mdb].[tbl-b1] AS tbl_b1
    ON tbl_b1.pk=tbl_a1.fk
WHERE 1
"""
crsr = cnxn.execute(sql)
for row in crsr:
    print(row)
crsr.close()
cnxn.close()

注意

    我只使用了一次文件规范并创建了表别名来引用这些表,并且 我将方括号放在表名周围,因为它们包含可能被误解为减号的连字符。

【讨论】:

这很有魅力,谢谢。我必须设置一个表别名才能在我的 ON 子句中使用它。请有人支持这个答案。

以上是关于Access ODBC:不同数据库文件中表之间​​的JOIN的主要内容,如果未能解决你的问题,请参考以下文章

Access 2010 和 Advantage 数据库服务器之间通过网络调用 ODBC 失败

Access ODBC passthru 查询失败,错误 3146 给出不同的错误描述文本

mfc中如何连接access数据库 求详细步骤

通过 Java jdbc odbc 连接到 Access 文件期间出现“超出系统资源”

在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异

JDBC-ODBC桥接器连接Access数据库