- ベストアンサー
Access2010でのクエリ作成におけるエラーの考えられる原因と解決方法
- Access2010でクエリを作成する際に「クエリが複雑すぎます」というエラーが表示される問題が発生しています。このエラーは新たに作成したユニオンクエリAに関連しており、他のテーブルやクエリとの紐付けによって発生しているようです。既存のクエリBでは同じユニオンクエリAを使用しているにも関わらずエラーが発生しないという点に疑問が生じています。
- この問題に対して考えられる原因として、ユニオンクエリAを使用しているクエリCが複雑な処理を行っていることが挙げられます。他のテーブルやクエリとの紐付けが複数存在し、その結果として処理が複雑化している可能性があります。また、クエリCを作成する際に何らかのミスがあった可能性も考えられます。
- この問題を解決するためには、以下の手順を試してみることができます。まず、クエリCの設定を見直し、不要な紐付けや処理を削除することで簡素化することができます。また、クエリCを一度削除し、再度作成することで何らかのミスが解消される可能性もあります。さらに、Accessを起動し直したり、端末自体を再起動することで一時的なエラーが解消されることもあります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
各テーブルの主キーに相当するフィールド。 具体的なデータ例☆。 期待する出力結果☆。 が無いと、残念ながら・・ 私には想像でササッと幾つかのSQLを提示できるだけの スキルを持ち合わせていません。 これだけでは何とも。。。ごめんなさいです。 ただ言えることは、、[] で括っているとはいえ F/O番号 というフィールド名は マズイと思います。 最初のリンク先にも載っています。 http://office.microsoft.com/ja-jp/access-help/HA010030643.aspx Access の予約記号 の部分です。 以下は珍怪答部類かもしれません、読み流して結構です。 GROUP BY で指定しているフィールドが多いので 非効率になっているようです。 UNION する前のAデータを、受注日で抽出し集計する。 それをマスターテーブルと繋げるようなことは出来ませんか。 SELECT Aデータ.受注日, Aデータ.コード, Aデータ.ライン, Sum(Aデータ.数量) AS 数量の合計, 0 AS [F_O番号] FROM Aデータ WHERE (Aデータ.受注日)=[forms]![メイン]![受注日]) GROUP BY Aデータ.受注日 とマスターをJOIN Bテーブルも同様、これをUNION ALL? のような方向です。
その他の回答 (4)
- nicotinism
- ベストアンサー率70% (1019/1452)
どうして何でしょうかねぇ? もう手詰まりです。 最後になりますが、オプション→オブジェクトデザイナーの クエリデザイン→すべてのフィールドを表示する のチェックは外してみてください。 外れていても個々のクエリで設定できますので デザインビューで開くことのできるクエリのプロパティも確認してください。 現状でアドバイスできるのは、これくらいです。 使用している各テーブルの実際の フィールド名・データ型・インデックス クエリのSQL ビューがあれば新たな展開が有るかもしれませんが 珍怪答になってしまいそうです。
- nicotinism
- ベストアンサー率70% (1019/1452)
ユニオンクエリの項目数合わせなんですが 「番号」は元々数値型なのでしょう? それを、番号:'000' で文字列扱いにしたらテーブル002の番号も文字列扱いになってしまいます。 番号: 0 か 番号: Null にして元々のデータ型を崩さない方がベターです。 UNION は重複レコードを排除しつつ連結しますが UNION ALL は全てを連結します。 目的に応じて使い分けますが、特に目的が無い場合は UNION ALL ですと重複排除の処理が無い分だけ高速です。
お礼
早速のご回答ありがとうございます。 おっしゃる通り、番号は数値でした。教えて頂いたように「番号:0」に修正致しました。 なお、UNIONとUNION ALLの違いにつきましては一応認識はしているのですが、今回、UNION ALLだと選択クエリで表示するフィールドがフィールド1~8までないとエラーとなり、UNIONとすると、一つのフィールドでも問題ない・・・という部分がよくわかりません。 今回の例でいうと、クエリα+クエリβでトータル300レコードで、UNIONとしても300レコードなので、とりあえず特に問題は無いのですが。。今後、UNION ALLでクエリを作成し、特定のフィールドでさらに条件付けして抽出したい場合、その特定のフィールドだけでなく全てのフィールドを表示しなければならないってことになるのでしょうか。
- nicotinism
- ベストアンサー率70% (1019/1452)
Accessの仕様の制限値を超えている http://office.microsoft.com/ja-jp/access-help/HA010341462.aspx フィールド名などに不適切なモノが有る http://office.microsoft.com/ja-jp/access-help/HA010030643.aspx ファイルが壊れかかっている などが考えられますけど、特に三番目。 新規accdbに全てインポートする。 ファイルタブ→オプション→カレントデータベースの 「名前の自動修正オプション」のチェックは全て外す 最適化を行う で改善しませんか?
お礼
ご回答ありがとうございます。 新規mdbを作成し、例のmdbのテーブル及びクエリを全てインポートしました。 その後、オプションのチェックを外し、最適化を行ってみましたが状況変わらずです。。 ちなみに、ユニオンクエリAですが、 <クエリα> テーブル001-----テーブル003 ・グループ化 ・テーブル001の数量を合計 <クエリβ> テーブル002-----テーブル003 ・グループ化 ・テーブル002の数量を合計 クエリαとβをユニオンクエリとしてます。 一つ気になるのは、テーブル002には「番号」というフィールドがありますが、テーブル001には存在しない為、クエリαでは『番号:'000'』として、クエリβとフィールドを合わせてます。 フィールド1 フィールド2 合計 番号 あああ いいい 1 000 かかか ききき 10 000 さささ ししし 5 000 たたた ちちち 58 123 ななな ににに 21 456 ははは ひひひ 150 789 ※フィールド1の「さささ」までがクエリα、「たたた」以降がβのレコード。 実際にはフィールドは9つあります。 で、このユニオンクエリを新規の選択クエリに追加して、全フィールドを追加すると問題ありません。「番号」を削除しても問題ありません。。しかし、フィールド1、フィールド2、合計のいずれかを削除しただけで「クエリが複雑すぎます」とエラーになってしまう次第です。 結果的に、ユニオンクエリの「UNION ALL SLECT・・・」を「UNION SELECT・・・」に変更したところ、現象が解消されました。 ALL付きとALL無しで何か制限事項などあるのでしょうか。
補足
スペル間違いがありました。 正しくは、「UNION ALL SELECT・・・」を「UNION SELECT・・・」に変更 です。
- chayamati
- ベストアンサー率41% (260/624)
自分の体験ですが、 VBAを繰り返し訂正していると、何をやってもエラーが解消しないことがあります。 その時これ 「空のACCESSファイルを作成し、ここへそのファイルをインポート」 をやると原因がどこにあるのかわかりませんが解消します。 あなたとは状況は違いますが、ダメ元で試して下さい。
お礼
ご回答ありがとうございました。 教えて頂いた内容を試してみましたが、状況変わらずでした。また、データベースの最適化/修復も行ってみましたがダメでした。 <切り分け> クエリBをコピーして開くと問題なく抽出されます。デザインで開いて テーブル1を削除→OK テーブル2を削除→OK テーブル3を削除→OK クエリXを削除→OK 全ての紐付けを解除しても問題ありませんでした。 フィールドが9個あり(上記で全ての紐付けを削除してるので、残ってるのはユニオンクエリAの全フィールドのみ)、その内1つを削除する分には問題ないのですが、残り8フィールドの内、どのフィールドを削除してもNGになることが発覚しました。 結果的に、ユニオンクエリAの9フィールドの内、フィールド9を削除する分には問題ありませんが、フィールド1~8の内1つでも削除すると「クエリが複雑すぎます」とでます。 新たにクエリを作成し、そのこユニオンクエリAのフィールド1~8を追加したところ問題無しで、やはり1つでも削除するとエラーとなります。なぜ、こんなことが起こるのか分かりません。。
お礼
ご回答ありがとうございます。 実際のユニオンクエリはフォーム上のフィールド(受注日)を見ており、その日付で抽出するようにしております。当該ユニオンクエリを新たに作成したクエリ上のデータビューで表示させようとすると、まず日付を求められます。で、日付を入力すると、その日付で抽出されます。 次に当該ユニオンクエリをUNION ALLとし同じようにデータビューで表示させようとすると、日付を求められるのですが、その後、『ODBC‐‐呼び出しが失敗しました。』と表示されます。 おとといの段階では、UNION ALLとした場合、日付が求められる以前に『クエリが複雑すぎます』とメッセージが表示されていたのですが変わってしまいました。特にクエリの内容は変更しておりません。。 ちなみに、ユニオンクエリのSQLは、 SELECT Aデータ.受注日, マスター.ベンダー, Aデータ.コード, Aデータ.ライン, マスター.部位, マスター.寸法, マスター.不良フラグ, Sum(Aデータ.数量) AS 数量の合計, 0 AS [F/O番号] FROM Aデータ INNER JOIN マスター ON Aデータ.コード = マスター.コード GROUP BY Aデータ.受注日, マスター.ベンダー, Aデータ.コード, Aデータ.ライン, マスター.部位, マスター.寸法, マスター.不良フラグ HAVING (((Aデータ.受注日)=[forms]![メイン]![受注日])) UNION ALL SELECT [Bデータ].受注日, マスター.ベンダー, [Bデータ].コード, [Bデータ].ライン, マスター.部位, マスター.寸法, マスター.不良フラグ, Sum([Bデータ].数量) AS 数量の合計, [Bデータ].[F/O番号] FROM [Bデータ] INNER JOIN マスター ON [Bデータ].コード = マスター.コード GROUP BY [Bデータ].受注日, マスター.ベンダー, [Bデータ].コード, [Bデータ].ライン, マスター.部位, マスター.寸法, マスター.不良フラグ, [Bデータ].[F/O番号] HAVING ((([Bデータ].受注日)=[forms]![メイン]![受注日])) ORDER BY マスター.ベンダー, Aデータ.コード; ※テーブル名、フィールド名は多少変更させて頂いております。 テーブル名※()内はフィールド名ですが沢山ある為、当該ユニオンクエリで使用しているものを抜粋) ・Aテーブル(受注日、コード、ライン、数量) ・Bテーブル(受注日、コード、ライン、数量、F/O番号) ・マスター(ベンダー、部位、寸法、不良フラグ) Aテーブルとマスター、Bテーブルとマスターはそれぞれ「コード」で紐付けています。