2010-06-17 7 views
1

ЗАДАНИЕ: Я в процессе миграции базы данных из MS Access в Maximizer. Для этого я должен взять 64 таблицы в MS ACCESS и объединить их в один. Вывод должен быть в виде файла TAB или CSV. Которая затем будет импортирована в Maximizer.Сбой запросов MS Access

ПРОБЛЕМА: доступа не может выполнить запрос, который является настолько сложным, кажется, так как он выходит из строя в любое время я выполнить запрос.

АЛЬТЕРНАТИВЫ: Я думал о нескольких альтернатив, и хотел бы сделать наименьшее отнимающих много времени один, из них, в то же время, пользуясь любыми возможностями, чтобы узнать что-то новое.

  1. Экспортируйте каждую таблицу в CSV и импортируйте в SQLight, а затем сделайте с ней запрос, чтобы сделать то же самое, что и ACCESS не удалось выполнить (слияние 64 таблиц).
  2. Экспортируйте каждую таблицу в CSV-файлы и напишите сценарий для доступа к каждому из них и объедините CSV-файлы в один CSV-файл.
  3. Каким-то образом подключитесь к MS ACCESS DB (API) и напишите сценарий, чтобы извлекать данные из каждой таблицы и объединять их в CSV-файл.

ВОПРОС: Что вы порекомендуете?

ПОЯСНЕНИЕ:

  1. Я присоединяемые таблицы, а не конкатенации. Каждая таблица имеет другую структуру и разные данные. Это нормализованная база данных CRM. Компании-> контакты-> details = ~ 60 таблиц деталей.
  2. Поскольку Access db будет запущен после переноса db, я хочу потратить как можно меньше времени на доступ.
+1

Вы можете представить структуру (обзор) и запрос? –

+1

Другая возможность может заключаться в том, чтобы выяснить, что не так технически, изменить ее в MS Access DB, а затем запустить запрос без сбоя базы данных. Возможно, это всего лишь вопрос недостаточной памяти, недостаточных индексов и т. Д. – MJB

ответ

4

Я согласен с 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) 
1

Я бы порекомендовал № 2, если слияние было довольно простым и понятным и не нуждалось в мощности РСУБД. Я бы пошел с №1, если слияние более сложное, и вам нужно будет написать некоторые фактические запросы, чтобы правильно объединить данные.

+1

Вы можете легко объединить CSV-файлы из командной строки COPY x + y z –

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; 

Вы можете построить Вкладыш заявления, 64 раз с VBA кодом, с другим из-за столом каждый раз. И выполните каждое утверждение с помощью CurrentDb.Execute

+0

Ahh. Я не хотел предполагать, что таблицы имеют одинаковый формат. Поскольку OP использовал «merge» вместо «concatenate» или «comb», я подумал, что участие в нем было связано. Хороший ответ - это допустимое предположение. – MJB

0

Я даже не понимаю, что вы пытаетесь сделать. Я предполагаю, что ваша проблема в том, что Jet/ACE не может обрабатывать UNION с помощью многих операторов SELECT.

Если у вас 64 одинаково структурированных таблиц, и вы хотите их в одном CSV, я бы создал временную таблицу в Access, добавьте каждую таблицу поочередно, а затем экспортируйте из таблицы temp в CSV. Это простое решение и не должно быть медленным. Единственная возможная проблема может заключаться в том, что если есть дубликаты, но если есть, вы можете экспортировать из SELECT DISTINCT сохраненного QueryDef.

Тангенциально, я удивлен, что Maximizer все еще существует. У меня был клиент, который использовал его, и структура db была ужасно ненормализованной, как и все другие коммерческие программы, такие как ACT.

+0

Я не знаком с Maximizer, но то, что вы говорите, похоже на то, что я думаю, что OP пытается сделать: слить ~ 60 нормализованных таблиц в одну гигантскую де-нормированную таблицу. Необычайно плохая идея ИМХО. Даже с моим низким мнением о MS Access этот * Maximizer * звучит еще хуже. –

Смежные вопросы