2

タスク: DB を MS Access から Maximizer に移行中です。これを行うには、MS ACCESS で 64 個のテーブルを取得し、それらを 1 つにマージする必要があります。出力は、TAB または CSV ファイルの形式である必要があります。その後、マキシマイザーにインポートされます。

問題: Access は、クエリを実行するたびにクラッシュするため、非常に複雑なクエリを実行できません。

代替案: いくつかの代替案を考えましたが、新しいことを学ぶ機会を利用しながら、これらの中で最も時間がかからないものを実行したいと思います.

  1. 各テーブルを CSV にエクスポートし、SQLight にインポートしてから、それを使用してクエリを作成し、ACCESS が失敗するのと同じことを行います (64 個のテーブルをマージします)。
  2. 各テーブルを CSV にエクスポートし、スクリプトを記述して各テーブルにアクセスし、CSV を単一の CSV にマージします。
  3. 何らかの方法で MS ACCESS DB (API) に接続し、各テーブルからデータを取得して CSV ファイルにマージするスクリプトを記述します。

質問: 何をお勧めしますか?

説明:

  1. 連結ではなく、テーブルをマージしています。各テーブルには、異なる構造と異なるデータがあります。これは正規化された CRM データベースです。会社 -> 連絡先 -> 詳細 = ~ 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;

毎回異なる FROM テーブルを使用して、VBA コードを使用して INSERT ステートメントを 64 回作成できます。そして、CurrentDb.Execute で各ステートメントを実行します。

于 2010-06-17T19:44:34.607 に答える
1

マージがかなり単純で簡単で、RDBMS の機能を必要としない場合は、#2 をお勧めします。マージがより複雑で、データを適切にマージするために実際のクエリを作成する必要がある場合は、#1 を使用します。

于 2010-06-17T19:16:38.610 に答える
0

あなたが何をしようとしているのかさえ明確ではありません。あなたの問題は、Jet/ACE がそれほど多くの SELECT ステートメントを持つ UNION を処理できないことだと思います。

同じ構造のテーブルが 64 個あり、それらを 1 つの CSV にまとめたい場合は、Access で一時テーブルを作成し、各テーブルを順番に追加してから、一時テーブルから CSV にエクスポートします。これは単純な解決策であり、遅くもないはずです。唯一の可能性のある問題は重複がある場合ですが、重複がある場合は、SELECT DISTINCT で保存された QueryDef からエクスポートできます。

接線的には、マキシマイザーがまだ存在していることに驚いています。ACT のような他のすべての販売ソフトウェアと同様に、db 構造はひどく正規化されていませんでした。

于 2010-06-18T22:02:48.167 に答える