查询导致MS Access崩溃

2 投票
4 回答
5072 浏览
提问于 2025-04-16 00:07

任务: 我正在把一个数据库从MS Access迁移到Maximizer。为了做到这一点,我需要把MS Access中的64个表合并成一个。最终的输出格式必须是制表符(TAB)或CSV文件,然后再导入到Maximizer中。

问题: Access似乎无法处理这么复杂的查询,每次我运行查询时都会崩溃。

替代方案: 我考虑了几个替代方案,希望能选择一个耗时最少的,同时也能学到一些新东西。

  1. 把每个表导出为CSV文件,然后导入到SQLight中,再用它来执行查询,完成Access无法做到的合并64个表的操作。
  2. 把每个表导出为CSV文件,写个脚本来访问每个文件,并将这些CSV合并成一个。
  3. 以某种方式连接到MS Access数据库(API),写个脚本从每个表中提取数据,并合并成一个CSV文件。

问题: 你有什么建议?

说明:

  1. 我是在合并表,而不是简单地连接。每个表的结构和数据都不同。这是一个规范化的客户关系管理(CRM)数据库。公司->联系人->详细信息,大约有60个详细信息表。
  2. 由于Access数据库在迁移后会被废弃,我希望在Access中花费的时间尽可能少。

4 个回答

1

如果合并的过程比较简单明了,不需要关系型数据库管理系统(RDBMS)的强大功能,我建议选择方案#2。如果合并的过程比较复杂,而且你需要写一些实际的查询来正确合并数据,那我建议选择方案#1。

2

既然你想把64个表合并在一起,我们可以假设这些表的结构都是一样的,对吧?

如果是这样的话,你可以先创建一个新的空表,确保这个新表的结构和其他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代码写64个INSERT语句,每次从不同的表中取数据。然后用CurrentDb.Execute来执行每个语句。

6

我同意FrustratedWithFormsDesigner的看法。第二种方法看起来是最简单的。

如果你决定采用这种方法,这里有一些经过测试的代码(需要用到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)

撰写回答