访问ODBC:在不同数据库文件中的表之间进行连接

时间:2016-01-20 09:17:28

标签: sql ms-access odbc

假设我有多个表分布在不同的Access数据库文件(* .mdb)中,我希望将其与" join"子句进入单个数据集。我现在唯一的解决方案是在Access数据库中创建链接表,除非有人知道更好更清洁的解决方案。

我尝试过的事情就是创建一个像SELECT * FROM tbl_a1 INNER JOIN [file_name].tbl_b1 ON [file_name].tbl_b1.pk=tbl_a1.fk WHERE 1这样的SQL语句,其中" 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创建链接表,但它没有告诉我如何以编程方式执行它。

注意:我正在使用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

1 个答案:

答案 0 :(得分: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()

请注意

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