sql - Access ODBC : JOIN between tables in different database files

标签 sql ms-access odbc

假设我有多个表分布在不同的 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()

注意

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

关于sql - Access ODBC : JOIN between tables in different database files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34895906/

相关文章:

php - 如何从存在重复节点名称的嵌套集表中获取每个节点的深度

mysql - MySQL 的表连接问题

c# - 如何删除 Access 中的表(如果存在)

c++ - 我们是否需要在每次调用 SQLExecdirect 之前调用 SQLAllocHandle 来分配一个 SQLHSTMT

c++ - 如何在 ODBC 中可移植地实现任意结果集的按行绑定(bind),同时避免对齐问题?

c++ - mysql c++ 连接器,如果连接断开,如何保持连接并重新连接?

PHP/MySQL : Adding records based on foreign keys

sql - ADODB SQL 语法 - 使用 Excel 工作表 Access 表内连接

ms-access - 将 mysql 转储或文本文件加载到 Microsoft Access 2003

ms-access - 如果是自动编号字段,则跳过复制此字段