みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access2010「クエリが複雑すぎます」

お世話になります。

ユニオンクエリAがあり、そのクエリを使用してクエリB(テーブルや別のクエリとも紐付け)を作成しました。問題なく抽出できます。
 <クエリB>
 ユニオンクエリA ----→ クエリX
             |
              ---→ テーブル1
             |
              ---→ テーブル2
             |
              ---→ テーブル3

新たにユニオンクエリAを使って、クエリCを作成したところ「クエリが複雑すぎます」と表示されてしまいます。いくつかのテーブル/クエリと紐付けていたので、一つずつ取っていったところ、最終的にはユニオンクエリA一つでもエラーが出てしまいます。単純な選択クエリです。

クエリBは同じユニオンクエリAを使い、複数のクエリとテーブルとを紐付けているのにも関わらずエラーとなりません。。

どのようなことが考えられますでしょうか。
Accessを起動し直したり、端末自体も再起動しましたが状況変わらずでした。
また、ユニオンクエリA単体を開いても問題無く抽出されます。

ご教授の程、宜しくお願い致します。

投稿日時 - 2013-04-09 19:16:15

QNo.8035314

すぐに回答ほしいです

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

各テーブルの主キーに相当するフィールド。
具体的なデータ例☆。
期待する出力結果☆。
が無いと、残念ながら・・
私には想像でササッと幾つかの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?
のような方向です。

投稿日時 - 2013-04-12 23:58:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

どうして何でしょうかねぇ?
もう手詰まりです。
最後になりますが、オプション→オブジェクトデザイナーの
クエリデザイン→すべてのフィールドを表示する のチェックは外してみてください。
外れていても個々のクエリで設定できますので
デザインビューで開くことのできるクエリのプロパティも確認してください。
現状でアドバイスできるのは、これくらいです。

使用している各テーブルの実際の
フィールド名・データ型・インデックス
クエリのSQL ビューがあれば新たな展開が有るかもしれませんが
珍怪答になってしまいそうです。

投稿日時 - 2013-04-11 16:53:34

お礼

ご回答ありがとうございます。

実際のユニオンクエリはフォーム上のフィールド(受注日)を見ており、その日付で抽出するようにしております。当該ユニオンクエリを新たに作成したクエリ上のデータビューで表示させようとすると、まず日付を求められます。で、日付を入力すると、その日付で抽出されます。

次に当該ユニオンクエリを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テーブルとマスターはそれぞれ「コード」で紐付けています。

投稿日時 - 2013-04-12 18:42:39

ANo.3

ユニオンクエリの項目数合わせなんですが
「番号」は元々数値型なのでしょう?
それを、番号:'000' で文字列扱いにしたらテーブル002の番号も文字列扱いになってしまいます。
番号: 0 か 番号: Null
にして元々のデータ型を崩さない方がベターです。

UNION は重複レコードを排除しつつ連結しますが
UNION ALL は全てを連結します。
目的に応じて使い分けますが、特に目的が無い場合は
UNION ALL ですと重複排除の処理が無い分だけ高速です。

投稿日時 - 2013-04-10 14:13:49

お礼

早速のご回答ありがとうございます。
おっしゃる通り、番号は数値でした。教えて頂いたように「番号:0」に修正致しました。

なお、UNIONとUNION ALLの違いにつきましては一応認識はしているのですが、今回、UNION ALLだと選択クエリで表示するフィールドがフィールド1~8までないとエラーとなり、UNIONとすると、一つのフィールドでも問題ない・・・という部分がよくわかりません。

今回の例でいうと、クエリα+クエリβでトータル300レコードで、UNIONとしても300レコードなので、とりあえず特に問題は無いのですが。。今後、UNION ALLでクエリを作成し、特定のフィールドでさらに条件付けして抽出したい場合、その特定のフィールドだけでなく全てのフィールドを表示しなければならないってことになるのでしょうか。

投稿日時 - 2013-04-10 15:14:55

ANo.2

Accessの仕様の制限値を超えている
http://office.microsoft.com/ja-jp/access-help/HA010341462.aspx

フィールド名などに不適切なモノが有る
http://office.microsoft.com/ja-jp/access-help/HA010030643.aspx

ファイルが壊れかかっている

などが考えられますけど、特に三番目。
新規accdbに全てインポートする。
ファイルタブ→オプション→カレントデータベースの
「名前の自動修正オプション」のチェックは全て外す
最適化を行う
で改善しませんか?

投稿日時 - 2013-04-10 12:42:50

補足

スペル間違いがありました。
正しくは、「UNION ALL SELECT・・・」を「UNION SELECT・・・」に変更 です。

投稿日時 - 2013-04-10 13:35:21

お礼

ご回答ありがとうございます。
新規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無しで何か制限事項などあるのでしょうか。

投稿日時 - 2013-04-10 13:32:52

ANo.1

自分の体験ですが、
VBAを繰り返し訂正していると、何をやってもエラーが解消しないことがあります。

その時これ
「空のACCESSファイルを作成し、ここへそのファイルをインポート」
をやると原因がどこにあるのかわかりませんが解消します。

あなたとは状況は違いますが、ダメ元で試して下さい。

投稿日時 - 2013-04-09 20:41:03

お礼

ご回答ありがとうございました。
教えて頂いた内容を試してみましたが、状況変わらずでした。また、データベースの最適化/修復も行ってみましたがダメでした。

<切り分け>
クエリBをコピーして開くと問題なく抽出されます。デザインで開いて
 テーブル1を削除→OK
 テーブル2を削除→OK
 テーブル3を削除→OK
 クエリXを削除→OK
全ての紐付けを解除しても問題ありませんでした。

フィールドが9個あり(上記で全ての紐付けを削除してるので、残ってるのはユニオンクエリAの全フィールドのみ)、その内1つを削除する分には問題ないのですが、残り8フィールドの内、どのフィールドを削除してもNGになることが発覚しました。

結果的に、ユニオンクエリAの9フィールドの内、フィールド9を削除する分には問題ありませんが、フィールド1~8の内1つでも削除すると「クエリが複雑すぎます」とでます。

新たにクエリを作成し、そのこユニオンクエリAのフィールド1~8を追加したところ問題無しで、やはり1つでも削除するとエラーとなります。なぜ、こんなことが起こるのか分かりません。。

投稿日時 - 2013-04-10 10:18:43

あなたにオススメの質問