ユニオンクエリとは?複数ファイルをまとめる方法と注意点

このQ&Aのポイント
  • ユニオンクエリを使用すると、複数のファイルをまとめて検索や集計が可能です。
  • ただし、フィールド数が多すぎる場合、ユニオンクエリはエラーとなる場合があります。
  • 他にも複数のファイルをまとめる方法としては、まとめファイルを作成し、テーブルをリンクする方法があります。
回答を見る
  • ベストアンサー

ユニオンクエリで複数ファイルをまとめるには

★はじめまして 会社でアクセスを使用している初心者です。 社員データーをアクセスファイルで管理しています。 10人が一つファイルを持って使用しています。 なので、ファイル数は10です。 フィールド(項目)数が128です。 全てのファイルは同じ項目です。 【問題】 (1)社員データーを検索する際に、全てのファイルを開いて検索すると非常に時間がかかります。 (2)社員データーをCSVでエクスポートして、EXCELで集計・分析する際に全てのファイルからエクスポートすると時間がかかります。 【対策】 (1)全てのファイルをまとめようと まとめファイルを作成して 全てのテーブルをリンクして(10ファイル) ユニオンクエリでまとめようと思いました。 【結果】 エラーです。 『定義されているフィールドが多すぎます』と表示されます。 【教えてください】 (1)フィールドが多すぎるとユニオンクエリは使用できないのですか? (2)他に全てのファイルをまとめる方法はないのでしょうか? ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ruru0707
  • ベストアンサー率68% (20/29)
回答No.3

10個のテーブルの構造が同じという事なので、1つのテーブルにデータをまとめるのが良いのではないでしょうか? その時、Mdbは別にして実行するMdbとはリンクテーブルにしておくと、良いと思います。 アクセスのデータベースは壊れる事もありますので、データMdbのバックアップを取るのも簡単になりますよ。 現状、わざわざ10個に分けている理由があれば(例えば支店毎にテーブルを分けているなどの場合)識別用のフィールドを追加する必要はあると思います。 後、集計をエクセルに出力しているそうですが、アクセスでやった方が簡単で早いのではないでしょうか? KeyやIndexなども有効に貼っておかれるとアクセスでの検索の処理速度は早くなります。 外部のデータベースへのテーブル作成クエリーや追加クエリーの実行が可能ですのでデータMdbを作成して、そこへ現在使用しているMdbからデータを追加していけば簡単に出来ますよ。

hakuyavaca
質問者

お礼

ご回答ありがとうございました。 間違って、『この回答への補足』に入力してしまいました。 申し訳ございません。

hakuyavaca
質問者

補足

回答ありがとうございました。 アクセス初心者で申し訳ございません。 少し補足をさせていただきます。 【補足】 社員データーをアクセスファイルで管理しています。 10人が一つファイルを持って使用しています。 1ファイルあたりの社員データーは300名です。 合計3,000名のデーターです。 ファイルは各支店ごとに分けて使用しています。 フィールド(項目)数が128です。 全てのファイルは同じフィールド(項目)です。 作業内容は社員データーの新規入力・データーの変更(編集)・データーの削除の3つです。 社内サーバーを使用して、各支店で入力しています。 アクセス2003を使用しています。 【回答内容の確認】 確かに、現在の使用方法があまり良くないのではと感じています。 10ファイルのテーブルに300名のデーターを入力編集を行うより、1つのファイルをリンクして入力したほうが良いと思います。 ただ、先輩方が 『アクセスは同時入力ができない』 『同時入力・編集作業をするとデーターが壊れる』 『データーの要領が重くなり作業効率が悪くなる』と聞いているので 1つのファイルに3,000名のデーターが入った状態で テーブルをリンクしたファイルを10作成して、 同時入力・編集・削除 作業スピード・データー破損は大丈夫でしょうか? もう一度ご教授お願いします。

その他の回答 (4)

  • ruru0707
  • ベストアンサー率68% (20/29)
回答No.5

#3です。 1つのテーブルを10名でリンクを貼って使用する事は実際可能です。 但し、テーブルへのデータ登録はどの様な方法を取られていますか? 直接テーブルを開いて書き込む方法や、フォームから入力していてもテーブルと直結しているような方法だと、おっしゃるように誰かがテーブルを開いていると使用中という事になってしまうかもしれませんね。 通常、3000名ものデータを扱っているのであればデータの保守メンテの面から言っても、直接テーブルに入力するような方法ではなく、1レコードずつ更新するようなフォームが用意されているのではないかと推測します。 (もしそうではない場合は、変更された方がいいと思います) その場合であれば同じ社員データを別々の人が同時に更新しに行かない限り問題はありません。 アクセスでテーブルを作成する場合(ワークテーブル以外)は、ほとんどの場合このようにデータMdbとプログラムMdbを分けて作成していますが、今まで何ら問題が発生した事がありません。(150名くらいのユーザーで) もちろんエラー発生時にはロールバックするような記述にしておくと、データは守られますので更に問題ないでしょう。

noname#140971
noname#140971
回答No.4

<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文を打ち込むのが一番簡単です。

noname#140971
noname#140971
回答No.2

そもそも、同じ構造のテーブルを10個使うなんて設計はしないでしょう。 列[所有者番号]などの列があれば統合できるんじゃないですか? それに、少なくとも、バックエンドとフロントエンドで擬似的なC/Sシステムで開発。 サーバーにはワークステーションを採用。 そうしないと使えたもんじゃないでしょう。 以上の改変に要する日数は1、2日。1週間もあれば十分。

hakuyavaca
質問者

お礼

回答有難うございました。 ご教授お願いします。 『列[所有者番号]などの列があれば統合できるんじゃないですか?』は具体的にどのようにすればよろしいでしょうか 教えてください。宜しくお願いします。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

以下の方法では、駄目ですか? 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

hakuyavaca
質問者

お礼

回答有難うございます。 教えていただいた方法で、試してみたのですが エラーです。 『定義されているフィールドが多すぎます』と表示されます。 他に方法はありますか? 宜しくお願いします。

関連するQ&A

  • ユニオンクエリから普通のクエリに変化

    フィールド数もフィールド名も全て同じにしたクエリを使用してユニオンクエリにしたところ 最初はマルが二つ重なったユニオンクエリマークでデザインビューでの編集ができなかったのに いつの間にか四角が二つ重なった普通のクエリマークになってデザインビューでの編集が可能になっています。 なぜでしょうか? ユニオンクエリではなくなってしまったのでしょうか? よろしくお願いします。

  • ユニオンクエリで開いたクエリは修正することはできないのでしょうか?

    ユニオンクエリで開いたクエリは修正することはできないのでしょうか? 新たにクエリ上で作ったフィールドではなく、元々テーブルにあるフィールドの情報を変更したいのですができません。 これを回避する方法はありますか?(アクセス2003です) よろしくお願い致します。

  • ユニオンクエリの結果を、テーブルにするには?

    ユニオンクエリを組んだあと、テーブルにしたくて、「テーブルの作成」をして実行を押すと、 「出力フィールドが必要です」とエラーが出てしまいます。 フィールドを選択しようとしても、空、なのですが、 どこで設定すればよいのでしょうか? ちなみに、ユニオンクエリを組み、実行すると、データは入っています。

  • ユニオンクエリについて質問です

    ユニオンクエリで表示したデータを元に表示されている日付を検索するようなフォームを作成したいのです。 テキストBOXに入力した日付と同じ日付のデータを持っているものを検索する時、再クエリをする必要があるとおもうのですが、ユニオンクエリをSQLで作成したので、再クエリの仕方が分かりません。 教えてください。よろしくお願いします

  • Access 2000、ユニオンクエリーがどうしても出来ない!

    初歩の質問ですが、ユニオンクエリーが出来ません。 やりたい事は非常に単純です↓↓ 1:テーブル1、テーブル2、テーブル3があります。 2:各テーブルのデータ内容は様々ですが、共通項目として「品番」を持っています。但しテーブル1は「製品名」、テーブル2と3は「品番」という項目名になっています。 3:各テーブル内に、品番が幾つ入っているか、集計クエリでカウントします。項目名が違うので以下のように処理しました。  <テーブル1の場合>    フィールド|品番のカウント: 製品名|タイトル: "テーブル1"    テーブル |テーブル1     集  計 |カウント  <テーブル2(或いは3)の場合>    フィールド|品番のカウント: 品番|タイトル: "テーブル2"    テーブル |テーブル2     集  計 |カウント 4:3の集計クエリーを繋ぎ、テーブル1~3の品番件数を一気に表示させたい  <ユニオンクエリの内容>     SELECT *     from Q0_カウント_テーブル1     UNION select *     from Q0_カウント_テーブル2     UNION select *     from Q0_カウント_テーブル3; 5:私の予想としてはこんな風↓↓出てくるはずだったのですが・・・     品番のカウント| タイトル     ------------------------------        30   | テーブル1        20   | テーブル2        23   | テーブル3  6:結果は「From句の間違いです」と出ます。他の質問も見ましたが、自分のSQLのどこを直せば良いのかわかりません・・・教えてください!

  • ACCESS ユニオンクエリはデータ編集ができない

    教えてください。初心者なので基本的なことで大変お恥ずかしいのですが・・・。 ACCESSでユニオンクエリを作成し、検索の結果としてフォーム上にデータが閲覧できるシステムを作りました。ユニオンクエリの元となる、テーブルは4つあります。 しかし、フォーム上からも、作成したクエリのデータシートビューからもデータの編集ができません。 クエリというのは、編集ができないという認識でいいのでしょうか。 データを編集するにはテーブルとしてインポートしなおして、作業するしかないのでしょうか? 何か良い方法があれば教えて下さい。

  • Adodcを使ってUnionクエリ

    VB+ADO+ACCESSで顧客管理のプログラムを作っています。 Accessのテーブルでは顧客の姓と名を別々のフィールドに分けているのですが、VBのDataComboでは顧客の姓名を一緒に表示し、選択出来るようにしたいと思っています。そのために、AdodcのRecordSourceプロパティで、Unionを使ったクエリの結果を表示したいのですが、上手くいきません。質問としては、根本的にUnionキーワードは使うことができるのでしょうか? よろしくお願いします。

  • ACCESSユニオンクエリから新テーブルを

    ACCESS2007/2010で、ユニオンクエリ(10個のテーブルをつないだ)から新テーブルを作りたいのですが、検索で調べて、なかなかピタリと説明してくれているサイトが見つかりません。。。 「ユニオンクエリ01」の指定 作成-クエリデザイン、閉じる、テーブルの作成 辺りをいじるんだと思われますが、 どなたか正確にナビして頂けませんでしょうか?

  • ユニオンクエリをデザインビューで開くには?

    アクセス2010です。 T_テーブル1とT_テーブル2があり、 どちらもフィールド1に文字が入っています。(テキスト型です) クエリのSQLビューで SELECT * FROM T_テーブル1 UNION ALL SELECT * FROM T_テーブル2; として保存したらユニオンクエリが出来上がったのですが、 これをクエリのデザインビューで見るにはどうすればいいですか? 以前のバージョンならユニオンクエリをデザインビューで見れました。 でもやり方を忘れました。 該当のクエリをアクティブにしてデザインビューを選択しても SQLビューで開いてしまいます。

  • ユニオンクエリでWHERE句を使うのは不可能でしょうか?

    アクセス2003です。 (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); WHERE (((番号) Like "*001")); としても 「SQLステートメントの後に文字が見つかりました。」 となってしまいます。 「番号」と言うフィールドは Q1、Q2、Q3どのクエリにもあり (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); のみなら正常に動作します。 作成したユニオンクエリで「フィルタの対象」で「*001」と入力したらちゃんと思い通りに動作します。 ユニオンクエリで条件抽出は不可能でしょうか? よろしくお願いします。