2

任务: 我正在将数据库从 MS Access 迁移到 Maximizer。为了做到这一点,我必须在 MS ACCESS 中获取 64 个表并将它们合并为一个。输出必须采用 TAB 或 CSV 文件的形式。然后将其导入 Maximizer。

问题: Access 无法执行看起来如此复杂的查询,因为它在我运行查询时崩溃。

替代方案: 我已经考虑了一些替代方案,并且想做一个耗时最少的替代方案,同时也利用任何机会学习新事物。

  1. 将每个表导出为 CSV 并导入 SQLight,然后使用它进行查询以执行与 ACCESS 无法执行的操作相同的操作(合并 64 个表)。
  2. 将每个表导出为 CSV 并编写一个脚本来访问每个表并将 CSV 合并为一个 CSV。
  3. 以某种方式连接到 MS ACCESS DB (API),并编写一个脚本来从每个表中提取数据并将它们合并到一个 CSV 文件中。

问题: 你有什么建议?

澄清:

  1. 我正在合并表,而不是连接。每个表都有不同的结构和不同的数据。它是一个规范化的 CRM 数据库。Companies->contacts->details = ~ 60 个详细信息表。
  2. 由于数据库迁移后Access db会被破坏,我希望尽可能少地在Access中花费时间。
4

4 回答 4

6

我同意FrustratedWithFormsDesigner。#2 似乎是最简单的方法。

如果您决定走这条路线,这里有一些经过测试的代码(需要pyodbc):

import csv
import pyodbc

MDB = 'c:/path/to/my.mdb'
DRV = '{Microsoft Access Driver (*.mdb)}'
PWD = 'mypassword'

conn = pyodbc.connect('DRIVER=%s;DBQ=%s;PWD=%s' % (DRV,MDB,PWD))
curs = conn.cursor()

SQL = 'SELECT * FROM mytable;' # insert your query here
curs.execute(SQL)

rows = curs.fetchall()

curs.close()
conn.close()

# you could change the 'w' to 'a' for subsequent queries
csv_writer = csv.writer(open('mytable.csv', 'w'), lineterminator='\n')

for row in rows:
    csv_writer.writerow(row)
于 2010-06-17T19:31:52.703 回答
2

既然要合并 64 个表,我们可以假设这些表都具有相同的结构吗?

如果是这样,则创建一个具有匹配结构的新空表,然后将这 64 个表中的每一个表中的行附加到新的合并主表中。然后将合并主表导出为单个 CSV 文件。

合并操作不必是单个复杂查询。

INSERT INTO tblMergeMaster(
    some_field,
    another_field,
    yet_another)
SELECT
    some_field,
    another_field,
    yet_another
FROM
    tbl_1_of_64;

您可以使用 VBA 代码构建 INSERT 语句 64 次,每次使用不同的 FROM 表。并使用 CurrentDb.Execute 执行每个语句

于 2010-06-17T19:44:34.607 回答
1

如果合并相当简单明了,并且不需要 RDBMS 的强大功能,我会推荐 #2。如果合并更复杂,我会选择#1,并且您需要编写一些实际查询来正确合并数据。

于 2010-06-17T19:16:38.610 回答
0

我什至不清楚您要做什么。我假设您的问题是 Jet/ACE 无法处理具有那么多 SELECT 语句的 UNION。

如果您有 64 个结构相同的表,并且希望它们在单个 CSV 中,我会在 Access 中创建一个临时表,依次附加每个表,然后从临时表导出到 CSV。这是一个简单的解决方案,也不应该很慢。唯一可能的问题可能是是否存在欺骗,但如果存在,您可以从 SELECT DISTINCT 保存的 QueryDef 中导出。

切线地,我很惊讶 Maximizer 仍然存在。我有一个客户曾经使用过它,并且 db 结构非常不规范,就像 ACT 等所有其他销售软件一样。

于 2010-06-18T22:02:48.167 回答