Запрос вылетает MS Access - PullRequest
       29

Запрос вылетает MS Access

1 голос
/ 17 июня 2010

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

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

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

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

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

РАЗЪЯСНЕНИЯ:

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

Ответы [ 4 ]

4 голосов
/ 17 июня 2010

Я согласен с 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)
2 голосов
/ 17 июня 2010

Поскольку вы хотите объединить 64 таблицы, можем ли мы считать, что все эти таблицы имеют одинаковую структуру?

Если это так, создайте новую пустую таблицу с соответствующей структурой, а затем добавьте строки из каждой из этих 64 таблицв новую главную таблицу слияния.Затем экспортируйте основную таблицу слияния как один файл CSV.

Операция объединения не должна быть одним сложным запросом.

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

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

1 голос
/ 17 июня 2010

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

0 голосов
/ 19 июня 2010

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

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

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

...