假设我有多个表分布在不同的 Access 数据库文件 (*.mdb) 中,我想将这些表与“连接”子句组合成一个数据集。目前我看到的唯一解决方案是在 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,并且预定义的数据库文件还不包括链接表。这些表也不必是永久的。 微软有一个 documentation如何仅使用 Microsoft Access 创建链接表,但它没有告诉我如何以编程方式进行。
注意:我使用 RAD 10 Seattle/VCL C++ Builder 和 UniDac 通过使用 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
最佳答案
如果您使用的是 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()
注意
- 我只使用了一次文件规范并创建了表别名来引用这些表,并且
- 我将表名放在方括号中,因为它们包含可能被误解为减号的连字符。
关于sql - Access ODBC : JOIN between tables in different database files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34895906/