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 给出不同的错误描述文本
通过 Java jdbc odbc 连接到 Access 文件期间出现“超出系统资源”
在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异