查询导致MS Access崩溃
任务: 我正在把一个数据库从MS Access迁移到Maximizer。为了做到这一点,我需要把MS Access中的64个表合并成一个。最终的输出格式必须是制表符(TAB)或CSV文件,然后再导入到Maximizer中。
问题: Access似乎无法处理这么复杂的查询,每次我运行查询时都会崩溃。
替代方案: 我考虑了几个替代方案,希望能选择一个耗时最少的,同时也能学到一些新东西。
- 把每个表导出为CSV文件,然后导入到SQLight中,再用它来执行查询,完成Access无法做到的合并64个表的操作。
- 把每个表导出为CSV文件,写个脚本来访问每个文件,并将这些CSV合并成一个。
- 以某种方式连接到MS Access数据库(API),写个脚本从每个表中提取数据,并合并成一个CSV文件。
问题: 你有什么建议?
说明:
- 我是在合并表,而不是简单地连接。每个表的结构和数据都不同。这是一个规范化的客户关系管理(CRM)数据库。公司->联系人->详细信息,大约有60个详细信息表。
- 由于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)