![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
Windows XP, MS Access 2007です。
レコード件数700件程度のテーブルTBLに以下のようなカラムがあります。
ID(主キー),NAME,REF_ID1, REF_ID2, REF_ID3,...., REF_ID10
NAMEは当該IDに紐づく名前であり、
REF_ID1~REF_ID10は、当該レコードと関連するレコードのIDを記載したものです。
これをレポート出力する際に、
関連レコードはIDではなく名前を出力したく
以下のようにクエリを作成しました。
SELECT TBL.ID, TBL.NAME, TBL1.NAME AS REF_NAME1, ...., TBL10.NAME AS REF_NAME10
FROM TBL, TBL AS TBL1, TBL AS TBL2, ..., TBL AS TBL10
WHERE TBL.REF_ID1 = TBL1.ID AND ... AND TBL.REF_ID10;
しかし、この方法だと結合するテーブル数が多くなるためか、
レポートの表示が非常に遅く、かつ、レポートの最後のページを開こうとすると
メモリ不足とのメッセージボックスが出力され、エラー終了してしまいました。
メモリはOSの限界4GBまで積んでいるため、
結合するテーブル数が多すぎるのが問題なのだと思いますが、
どのような方法がよいのでしょうか。
No.2ベストアンサー
- 回答日時:
>結合するテーブル数が多すぎるのが問題なのだと思いますが、
>どのような方法がよいのでしょうか。
テーブル結合を、INNER JOINかLEFT JOINにする。
現状では「全部のテーブルが無条件結合」されるので、内部的に「総当りですべての組み合わせ」が内部的に作られてから、WHEREに一致しないレコードが除外されるので、たぶん、4GBのメモリがあっても足りないだろうと思われます。
「総当りですべての組み合わせを作った場合のレコード数」は「すべてのテーブルのレコード数を掛け算した数」です。
例えば、700レコードある基本のTBLに、50レコードあるテーブルを無条件に結合すると、内部的に700×50=35000レコードのデータが生成されます。
もし、主テーブルが700レコード、各サブテーブルが100レコードあれば、主のTBLにTBL1~TBL10を無条件結合すると、700×100×100×100×100×100×100×100×100×100×100=70000000000000000000000レコード生成されます。
1レコードに200バイト使用すると仮定すると、14000000000000000000000000バイト必要です。
自分が、どんだけ無謀な事をしようとしているか、理解した方が良いです。
No.6
- 回答日時:
追記。
ANo.4のクエリを
主TBL:700レコード
副TBL1~10:100レコード
の11個のテーブルで結合してみたが、まったく問題なく動作した。
動作環境は、あえて
WinXP Pro SP3
Access97
メモリ768MB
CPU Celeron CPU 2.5GHz
というチープな環境にしてみたが、まったく問題が無かった。
No.5
- 回答日時:
内部結合を使えばどうでしょうか。
SELECT TBL.ID, TBL.NAME, TBL_1.NAME, TBL_2.NAME, TBL_3.NAME, TBL_4.NAME, TBL_5.NAME, TBL_6.NAME, TBL_7.NAME, TBL_8.NAME, TBL_9.NAME, TBL_10.NAME
FROM (((((((((TBL INNER JOIN TBL AS TBL_1 ON TBL.REF_ID1 = TBL_1.ID) INNER JOIN TBL AS TBL_2 ON TBL.REF_ID2 = TBL_2.ID) INNER JOIN TBL AS TBL_3 ON TBL.REF_ID3 = TBL_3.ID) INNER JOIN TBL AS TBL_4 ON TBL.REF_ID4 = TBL_4.ID) INNER JOIN TBL AS TBL_5 ON TBL.REF_ID5 = TBL_5.ID) INNER JOIN TBL AS TBL_6 ON TBL.REF_ID6 = TBL_6.ID) INNER JOIN TBL AS TBL_7 ON TBL.REF_ID7 = TBL_7.ID) INNER JOIN TBL AS TBL_8 ON TBL.REF_ID8 = TBL_8.ID) INNER JOIN TBL AS TBL_9 ON TBL.REF_ID9 = TBL_9.ID) INNER JOIN TBL AS TBL_10 ON TBL.REF_ID10 = TBL_10.ID;
試してないので、改善できるかどうかは不明です。
これで改善できないようなら、クエリを使わずに、レポートのレコードソースは TBL にして、
名前のテキストボックスをコンボボックスにして表示させるようにしたらどうでしょうか。
コンボボックスの設定は、
コントロールソース REF_ID1
値集合ソース TBL
連結列 1
列数 2
列幅 0cm
以下、コントロールソースのみ変更して、他のそのままの設定のコンボボックスを REF_ID10 まで作成します。
No.4
- 回答日時:
具体的には、以下のようなクエリになるであろう。
SELECT TBL.ID, TBL.NAME, TBL1.NAME AS REF_NAME1, TBL2.NAME AS REF_NAME2, TBL3.NAME AS REF_NAME3, TBL4.NAME AS REF_NAME4, TBL5.NAME AS REF_NAME5, TBL6.NAME AS REF_NAME6, TBL7.NAME AS REF_NAME7, TBL8.NAME AS REF_NAME8, TBL9.NAME AS REF_NAME9, TBL10.NAME AS REF_NAME10
FROM (((((((((TBL INNER JOIN TBL1 ON TBL.REF_ID1 = TBL1.ID) INNER JOIN TBL2 ON TBL.REF_ID2 = TBL2.ID) INNER JOIN TBL3 ON TBL.REF_ID3 = TBL3.ID) INNER JOIN TBL4 ON TBL.REF_ID4 = TBL4.ID) INNER JOIN TBL5 ON TBL.REF_ID5 = TBL5.ID) INNER JOIN TBL6 ON TBL.REF_ID6 = TBL6.ID) INNER JOIN TBL7 ON TBL.REF_ID7 = TBL7.ID) INNER JOIN TBL8 ON TBL.REF_ID8 = TBL8.ID) INNER JOIN TBL9 ON TBL.REF_ID9 = TBL9.ID) INNER JOIN TBL10 ON TBL.REF_ID10 = TBL10.ID;
No.3
- 回答日時:
>>それはそうだと思うので、どうすれば可能なのかを教えてください。
一般的には、いくつかの中間テーブルにいくつかのテーブルの結合結果を収容する処理を行います。
そうして、中間テーブルどうしを結合する処理にすれば、最終結果を得るときの結合テーブル数を減らすことが可能となります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessにインポートしたら並び...
-
Accessで重複したデータを一件...
-
3つ以上のテーブルをUNIONする...
-
データの二重表示の原因
-
Accessでの排他制御
-
重複データを除いてインポート
-
delete⇒insert
-
掲示板用のDB設計
-
数百万件レコードのdelete
-
ACCESSファイルを開こうとする...
-
(ACCESS)並び替えをしないで...
-
2つの項目が重複するレコード...
-
Excel→Accessテーブル インポ...
-
Access VBA Me.Requery レコー...
-
テーブルのレコード削除ができ...
-
AccessのSQLについて教えてくだ...
-
Access 削除クエリが重い
-
非連結サブフォームのレコード...
-
レコードロックする方法
-
Access2000でのExcel行の削除法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
3つ以上のテーブルをUNIONする...
-
Access VBA Me.Requery レコー...
-
数百万件レコードのdelete
-
Access 1レコードずつcsvで出力...
-
Access カレントレコードがあり...
-
ACCESSのBookmarkプロパティの...
-
Access 削除クエリが重い
-
2つの項目が重複するレコード...
-
非連結サブフォームのレコード...
-
ManagementStudioからのデータ削除
-
Accessで重複したデータを一件...
-
フォームからのレコード削除に...
-
ACCESSにて全項目(レポート)...
-
Accessの重複クエリで最小以外...
-
SQLServerで同一条件レコードの...
-
(ACCESS)並び替えをしないで...
-
テーブルのレコード削除ができ...
-
Accessでの排他制御
おすすめ情報