Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルユニオンクエリについて
記事No172269
投稿日: 2018/05/15(Tue) 16:15
投稿者さこっしゅ
解決済: ON
OS:Windows10 Pro
Access Version:Access2016

ユニオンクエリについてご質問させてください。

ユニオンクエリは
「複数テーブルのデータを繋げる」
ものと思い込んでいます。

その複数テーブルのどれかが欠けても
成り立つようにクエリを組むことはできるでしょうか。


●テーブル名        「T_0001」「T_0002」「T_0003」
●各テーブルのフィールド  「日付」「商品」「数量」


上の3つのテーブルを単純に結合するためであれば

SELECT * FROM T_0001
UNION ALL
SELECT * FROM T_0002
UNION ALL SELECT * FROM T_0003;

で合っていると思っているのですが、(これも違っていたらすみません)
データを結合したい場合に、テーブルのどれかが揃っていないときでも
問題なくユニオンクエリを実行したいです。

勉強不足で申し訳ないですが、どなたかご教示お願い致します。

タイトルRe: ユニオンクエリについて
記事No172270
投稿日: 2018/05/16(Wed) 09:54
投稿者hatena
解決済: ON
> で合っていると思っているのですが、(これも違っていたらすみません)
> データを結合したい場合に、テーブルのどれかが揃っていないときでも
> 問題なくユニオンクエリを実行したいです。

クエリだけでは無理ですね。
参照するテーブルがなければエラーになります。

VBAでクエリのSQLを動的に書き換えることになります。

タイトルRe^2: ユニオンクエリについて
記事No172272
投稿日: 2018/05/16(Wed) 14:02
投稿者さこっしゅ
解決済: ON
hatenaさん、さっそくのご回答ありがとうございます。


> クエリだけでは無理ですね。
> 参照するテーブルがなければエラーになります。
>
> VBAでクエリのSQLを動的に書き換えることになります。


ということですが、IIF関数を使用して
 テーブル「T_0001」が存在する場合はデータ参照、
 テーブル「T_0001」が存在しない場合は空データを参照、
 テーブル「T_0002」が存在する場合は・・・
というようにVBAを組むイメージでしょうか。


理解が足らず申し訳ないです。
VBAについても、詳細をご教示いただけると助かります。

タイトルRe: ユニオンクエリについて
記事No172271
投稿日: 2018/05/16(Wed) 13:08
投稿者よろずや
解決済: ON
> その複数テーブルのどれかが欠けても
> 成り立つようにクエリを組むことはできるでしょうか。

データが無いときは、空のテーブルを用意しましょう。
ってか、テーブルそのものを削除するような運用は普通しません。
テーブルの中身だけを削除しましょう。

タイトルRe^2: ユニオンクエリについて
記事No172273
投稿日: 2018/05/16(Wed) 14:26
投稿者さこっしゅ
解決済: ON
よろずやさん、ご回答ありがとうございます。


> データが無いときは、空のテーブルを用意しましょう。
> ってか、テーブルそのものを削除するような運用は普通しません。
> テーブルの中身だけを削除しましょう。


■やりたいこととしては以下の通りです。

@実績発生時、実績集計用アクセスにてデータを蓄積
 (このとき、実績発生場所の違いが「T_0001」や「T_0002」の違いになります)

ACドライブ直下に「T_0001」〜「T_0003」エクセルファイルを作成するマクロを設定
 (実績の有無で「T_0001」がない場合や「T_0003」がない場合などを想定)

B運用アクセスにて、Cドライブ内「T_0001」〜「T_0003」ファイルをリンク関連付け

Cユニオンクエリで結合したデータを追加クエリで集計テーブルに蓄積

Dユニオンクエリで結合に使用したCドラ直下の「T_0001」〜「T_0003」ファイルを
 重複読込みを防止するためにKILL関数で削除

このDのときにCドラ直下のエクセルファイルを削除するつもりでして、
リンクテーブルは残るもののリンク元のエクセルファイルデータがないため
クエリが動かないという事象になっています。


●リンクテーブルでユニオンクエリを組むことをやめた方がいいでしょうか。
●意図的に空のテーブルを作成させる方法などを組み入れてやる方がいいでしょうか。
●Cドラ直下エクセルファイルの内容のみ削除する方法があったりするものなのでしょうか。


何かいい方法があればご教示いただきたいですし、
上の@〜Dの方法は無理ということであれば再考いたします。

タイトルRe^3: ユニオンクエリについて
記事No172275
投稿日: 2018/05/17(Thu) 22:15
投稿者よろずや
解決済: ON
エクセルはデータベースではありません。
細々とした約束事を守って初めてデータベースとして使えるのです。
その約束事を破る一つがKillになります。
その時点で、データベースではありません。
リンクでUNIONは無理です。
1ファイルずつ存在を確認しつつ取り込むしかありません。

タイトルRe^4: ユニオンクエリについて
記事No172276
投稿日: 2018/05/18(Fri) 08:55
投稿者さこっしゅ
解決済: ON
よろずやさん、


> エクセルはデータベースではありません。
> 細々とした約束事を守って初めてデータベースとして使えるのです。
> その約束事を破る一つがKillになります。
> その時点で、データベースではありません。
> リンクでUNIONは無理です。
> 1ファイルずつ存在を確認しつつ取り込むしかありません。


ありがとうございます。
やはり「リンクテーブルをユニオンクエリで結合しようとしている」ところと、
「Kill関数でリンク元のファイルを削除する場合がある」というところが
根本的な考え方として間違っているということですね。

何か他の方法を検討してみます。

タイトルRe^3: ユニオンクエリについて
記事No172277
投稿日: 2018/05/18(Fri) 10:15
投稿者hatena
解決済: ON
私も全面的によろずやさんの意見に賛成です。

テーブルが存在したりしなかったりする設計では、
今回だけでなく、今後、あらゆる場面で今回のように面倒な
ことか必要になります。

さらにいれば、複数のテーブルをユニオンで繋げるのではなく、
最初から一つのテーブルになるような設計にすべきです。

> @実績発生時、実績集計用アクセスにてデータを蓄積
>  (このとき、実績発生場所の違いが「T_0001」や「T_0002」の違いになります)

ここで、実績発生場所 をフィールドとして持たせれば一つのテーブルにできます。

> ACドライブ直下に「T_0001」〜「T_0003」エクセルファイルを作成するマクロを設定
>  (実績の有無で「T_0001」がない場合や「T_0003」がない場合などを想定)
>
> B運用アクセスにて、Cドライブ内「T_0001」〜「T_0003」ファイルをリンク関連付け

なぜ、エクセルファイルを生成するのでしょうか。
実績集計用アクセスから追加インポートではだめなんでしょうか。

あるいは、実績集計用アクセスへのリンクテーブルににしてそれから追加クエリを作成するとか。

タイトルRe^4: ユニオンクエリについて
記事No172278
投稿日: 2018/05/18(Fri) 11:32
投稿者さこっしゅ
解決済: ON
hatenaさん、


> テーブルが存在したりしなかったりする設計では、
> 今回だけでなく、今後、あらゆる場面で今回のように面倒なことか必要になります。
> さらにいれば、複数のテーブルをユニオンで繋げるのではなく、
> 最初から一つのテーブルになるような設計にすべきです。


設計が甘かったなと痛感しております。
違う方法がないか試してみます。


> 実績集計用アクセスから追加インポートではだめなんでしょうか。


その発想はなかったです。
エクセルデータのエクスポートをして、そのデータをリンクさせることが
最善の方法と思い込んでおりました。


> あるいは、実績集計用アクセスへのリンクテーブルににしてそれから追加クエリを作成するとか。


それでもできるかどうか、試してみます。



今回は設計方法の甘さにより、今のままだとやりたいことが実現できないことがわかりました。
ここでクローズいたします。
ご教示いただきましたお二方、ありがとうございました。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る