- ベストアンサー
ユニオンクエリとは?複数ファイルをまとめる方法と注意点
- ユニオンクエリを使用すると、複数のファイルをまとめて検索や集計が可能です。
- ただし、フィールド数が多すぎる場合、ユニオンクエリはエラーとなる場合があります。
- 他にも複数のファイルをまとめる方法としては、まとめファイルを作成し、テーブルをリンクする方法があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
10個のテーブルの構造が同じという事なので、1つのテーブルにデータをまとめるのが良いのではないでしょうか? その時、Mdbは別にして実行するMdbとはリンクテーブルにしておくと、良いと思います。 アクセスのデータベースは壊れる事もありますので、データMdbのバックアップを取るのも簡単になりますよ。 現状、わざわざ10個に分けている理由があれば(例えば支店毎にテーブルを分けているなどの場合)識別用のフィールドを追加する必要はあると思います。 後、集計をエクセルに出力しているそうですが、アクセスでやった方が簡単で早いのではないでしょうか? KeyやIndexなども有効に貼っておかれるとアクセスでの検索の処理速度は早くなります。 外部のデータベースへのテーブル作成クエリーや追加クエリーの実行が可能ですのでデータMdbを作成して、そこへ現在使用しているMdbからデータを追加していけば簡単に出来ますよ。
その他の回答 (4)
- ruru0707
- ベストアンサー率68% (20/29)
#3です。 1つのテーブルを10名でリンクを貼って使用する事は実際可能です。 但し、テーブルへのデータ登録はどの様な方法を取られていますか? 直接テーブルを開いて書き込む方法や、フォームから入力していてもテーブルと直結しているような方法だと、おっしゃるように誰かがテーブルを開いていると使用中という事になってしまうかもしれませんね。 通常、3000名ものデータを扱っているのであればデータの保守メンテの面から言っても、直接テーブルに入力するような方法ではなく、1レコードずつ更新するようなフォームが用意されているのではないかと推測します。 (もしそうではない場合は、変更された方がいいと思います) その場合であれば同じ社員データを別々の人が同時に更新しに行かない限り問題はありません。 アクセスでテーブルを作成する場合(ワークテーブル以外)は、ほとんどの場合このようにデータMdbとプログラムMdbを分けて作成していますが、今まで何ら問題が発生した事がありません。(150名くらいのユーザーで) もちろんエラー発生時にはロールバックするような記述にしておくと、データは守られますので更に問題ないでしょう。
<tab_1> ID___fld_1___fld_2 1____A_______あ 2____B_______い <tab_2> ID___fld_1___fld_2 1____C_______う 2____D_______え この2つをフォームのイミディエイトウインドウで統合することにします。 <tab_new> ID___owner__fld_1___fld_2 [イミディエイト] ? CnnExecute("INSERT INTO tab_new SELECT * FROM tab_1;") True これで、<tab_new>は次のようになります。 ID___owner___fld_1___fld_2 1___________0__A_______あ 2___________0__B_______い 次に、列[owner]の値を1に設定します。 [イミディエイト] ? CnnExecute("UPDATE tab_new Set owner=1;") True ID___owner___fld_1___fld_2 1___________1__A_______あ 2___________1__B_______い 同じ、要領で tab2 も tab_new へ追加。 [イミディエイト] ? CnnExecute("INSERT INTO tab_new SELECT * FROM tab_2;") True ID___owner___fld_1___fld_2 1___________1__A_______あ 1___________0__A_______あ 2___________1__B_______い 2___________0__B_______い ※[ID]は予め重複を許可! 今度の列[owner]の値を2に設定する要領は少し違います。 ? CnnExecute("UPDATE tab_new Set owner=2 WHERE owner=0;") True ID___owner___fld_1___fld_2 1___________1__A_______あ 1___________2__A_______あ 2___________1__B_______い 2___________2__B_______い 最後に、 ? CnnExecute("UPDATE tab_new Set ID=ID+Owner*10000;") True ID__________owner___fld_1___fld_2 10001___________1__A_______あ 10002___________1__B_______い 20001___________2__A_______あ 20002___________2__B_______い と[ID]をユニークにして'主キー'宣言。 ※[ID]を完全連番にしたい場合は、別に再質問されることにして、こんな感じです。 ※各社員は、列[owner]が一致するレコードだけを参照するように制限。 こんな感じてよければ、肝心のCnnExecute関数を補足します。 クエリでやってもいいですが、間違った場合など実にヤヤコシイ。 イミディエイトウインドウでSQL文を打ち込むのが一番簡単です。
そもそも、同じ構造のテーブルを10個使うなんて設計はしないでしょう。 列[所有者番号]などの列があれば統合できるんじゃないですか? それに、少なくとも、バックエンドとフロントエンドで擬似的なC/Sシステムで開発。 サーバーにはワークステーションを採用。 そうしないと使えたもんじゃないでしょう。 以上の改変に要する日数は1、2日。1週間もあれば十分。
お礼
回答有難うございました。 ご教授お願いします。 『列[所有者番号]などの列があれば統合できるんじゃないですか?』は具体的にどのようにすればよろしいでしょうか 教えてください。宜しくお願いします。
- pkh4989
- ベストアンサー率62% (162/260)
以下の方法では、駄目ですか? SELECT * FROM TABLE1 UNION SELECT * FROM TABLE2 UNION SELECT * FROM TABLE3 UNION SELECT * FROM TABLE4 UNION SELECT * FROM TABLE5 UNION SELECT * FROM TABLE6 UNION SELECT * FROM TABLE7 UNION SELECT * FROM TABLE8 UNION SELECT * FROM TABLE9 UNION SELECT * FROM TABLE10
お礼
回答有難うございます。 教えていただいた方法で、試してみたのですが エラーです。 『定義されているフィールドが多すぎます』と表示されます。 他に方法はありますか? 宜しくお願いします。
お礼
ご回答ありがとうございました。 間違って、『この回答への補足』に入力してしまいました。 申し訳ございません。
補足
回答ありがとうございました。 アクセス初心者で申し訳ございません。 少し補足をさせていただきます。 【補足】 社員データーをアクセスファイルで管理しています。 10人が一つファイルを持って使用しています。 1ファイルあたりの社員データーは300名です。 合計3,000名のデーターです。 ファイルは各支店ごとに分けて使用しています。 フィールド(項目)数が128です。 全てのファイルは同じフィールド(項目)です。 作業内容は社員データーの新規入力・データーの変更(編集)・データーの削除の3つです。 社内サーバーを使用して、各支店で入力しています。 アクセス2003を使用しています。 【回答内容の確認】 確かに、現在の使用方法があまり良くないのではと感じています。 10ファイルのテーブルに300名のデーターを入力編集を行うより、1つのファイルをリンクして入力したほうが良いと思います。 ただ、先輩方が 『アクセスは同時入力ができない』 『同時入力・編集作業をするとデーターが壊れる』 『データーの要領が重くなり作業効率が悪くなる』と聞いているので 1つのファイルに3,000名のデーターが入った状態で テーブルをリンクしたファイルを10作成して、 同時入力・編集・削除 作業スピード・データー破損は大丈夫でしょうか? もう一度ご教授お願いします。