🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

5242閲覧

Access SQL UNIONしたSELECT結果を別テーブルに書き込む方法

salty_

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/09/19 04:51

編集2019/09/19 04:59

##実現したいこと
Excel VBAにてこの2つのテーブルの結合結果をシートに書き込むマクロを作成しております。
SQL文について教えていただきたく質問しております。

求めたい結果はこのように2つのテーブルを結合させたものです。
イメージ説明

##テーブルについて
1.購入者テーブル
ID 管理番号 氏名 累積金額
1 11111 あいうえお ¥56,000
2 22222 かきくけこ ¥12,000
3 33333 まみむめも ¥670,000

2.購入回数テーブル
ID 管理番号 氏名 購入回数
1 11111 あいうえお 10
3 33333 まみむめも 85
4 66666 らりるれろ 96

##やってみたこと①SELECT-UNION
管理システムの関係上、どちらか片方にしかないデータが数多くあるため
UNIONを使って2つのテーブルを結合させました。
こちらを参考に作りました。
リンク内容

SELECT * FROM [購入者テーブル] As A LEFT JOIN [購入回数テーブル] As B ON A.[管理番号] = B.[管理番号] AND A.[氏名] = B.[氏名] UNION ALL SELECT * FROM [購入者テーブル] As A RIGHT JOIN [購入回数テーブル] As B ON A.[管理番号] = B.[管理番号] AND A.[氏名] = B.[氏名];

その結果がこちらになります。
イメージ説明

<できなかったこと>
この結果を、別のテーブルにINSERT INTO やSELECT INTO 等で書きだそうと思ったのですが
このエラーが出て実行できませんでした。
イメージ説明


また、不要なフィールドがあるため、必要なものだけにしてみました。

SELECT A.[管理番号],A.[氏名],A.[累積金額],B.[購入回数] FROM [購入者テーブル] As A LEFT JOIN [購入回数テーブル] As B ON A.[管理番号] = B.[管理番号] AND A.[氏名] = B.[氏名] UNION ALL SELECT A.[管理番号],A.[氏名],A.[累積金額],B.[購入回数] FROM [購入者テーブル] As A RIGHT JOIN [購入回数テーブル] As B ON A.[管理番号] = B.[管理番号] AND A.[氏名] = B.[氏名];

その結果がこちらになります。
イメージ説明
このように、歯抜けといいますか、空白の項目が出てしまうため、次項のUPDATEを試みました。

##やってみたこと②UPDATE
片方のデータにしかない行は管理番号や氏名が表示されないので
データがない場合は片方のテーブルのデータで埋めるようにUPDATE文を作りました。

ただ、やってみたこと①では、UNION結果をテーブルに書き込みできていないので
こちら↓
イメージ説明
を別の「テーブル2」に貼り付けて実行しました。

UPDATE [テーブル2] SET [テーブル2].[管理番号] = IIf(IsNull([テーブル2].[管理番号]),"-",[テーブル2].[管理番号]), [テーブル2].[氏名] = IIf(IsNull([テーブル2].[氏名]),[テーブル2].[B-氏名],[テーブル2].[氏名]), [テーブル2].[累積金額] = IIf(IsNull([テーブル2].[累積金額]),"データなし",[テーブル2].[累積金額]), [テーブル2].[購入回数] = IIf(IsNull([テーブル2].[購入回数]),"データなし",[テーブル2].[購入回数])

この結果がこちらになります。
イメージ説明
この結果を、必要な列だけにすれば求めたい結果となるのですが、
やってみたこと①の結果をテーブルに書き出せていないため
UPDATEに進めず、困っております。

##教えていただきたいこと
1.UNIONしたSELECT結果をINSERT INTO もしくはSELECT INTOで別のテーブルに書き出すことは
可能でしょうか?

2.もし、別テーブルに書き出しができない場合は、実現する方法はほかにはありますでしょうか・・?

##実行環境
windows10/MS-Access 2016です。

拙い質問で申し訳ありませんが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2019/09/19 05:22

2つのテーブルの主キーは何でしょうか。 あと、「テーブルの正規化」については理解してますか。
salty_

2019/09/19 05:41

hatena19様 主キーは【管理番号】、【氏名】の2つを設定しております。 テーブルの正規化は、申し訳ありません、理解しておりません・・・・。
hatena19

2019/09/19 05:53

2つのテーブルともですか。 同じ管理番号で複数の氏名が存在する、あるいは同じ管理番号で複数の氏名が存在することはあるのですか。 また、IDフィールドは何のために存在するのでしょうか。 もし、上記のことがないのなら、管理番号だけを主キーにすればいいと思います。 このデータ関係をあいまいのままにしておくと、データベースとしてはつかいものにならない結果になります。
guest

回答3

0

ベストアンサー

正規化ついてはスルーして、とりあえず現状のテーブルでということなら、

sql

1select base.管理番号, base.氏名, a.累積金額, b.購入回数 2from 3( 4 ( 5 select 管理番号, 氏名 FROM 購入者テーブル 6 union 7 select 管理番号, 氏名 FROM 購入回数テーブル 8 ) as base 9 left join 購入者テーブル as a 10 on base.管理番号=a.管理番号 and base.氏名=a.氏名 11) 12left join 購入回数テーブル as b 13on base.管理番号=b.管理番号 and base.氏名=b.氏名

投稿2019/09/19 07:11

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salty_

2019/09/19 07:27

ご回答ありがとうございます!すみません、検証に少しお時間ください。 正規化の件も、ご助言ありがとうございます。正直、テーブルの構造については全然わかっていないと思います・・・また明日以降コメントさせていただきます!よろしくお願いします。
salty_

2019/09/25 01:05

遅くなってしまい申し訳ありませんでした。こちらの方法で、求めたい結果を求めることができました!!こんな風にUNIONやLEFT JOINを組み合わせられるとは、本当にまだまだ勉強しなくてはと思いました。どうもありがとうございました。
hatena19

2019/09/25 01:10

本来はテーブルを「正規化」すべきです。 正規化すると、購入者の情報と、購入履歴の情報の2つのテーブルになるはずです。 余裕があればご検討ください。
salty_

2019/10/08 06:42

hatena19様、先日はどうもありがとうございました。こちらの件は、ひとまずよかったのですが、別件でやはりテーブル構造に問題があり、うまくいかない事案が発生しました。【正規化】という言葉は知っているけど具体的に知識を深めたことがなかったため、今まで放置しておりましたが(今まで大規模なデータを扱ってもいなかったので・・・)今回きちんと勉強することにいたしました!ご助言どうもありがとうございました。がんばります。
guest

0

以下のSQLを元にしてみて下さい。

SQL

1select base.管理番号, base.氏名, a.累積金額, b.購入回数 2from (( 3 select 管理番号, 氏名 4 from ( 5 select 管理番号, 氏名 FROM 購入者テーブル 6 union all 7 select 管理番号, 氏名 FROM 購入回数テーブル 8 ) as key 9 group by 管理番号, 氏名 10 ) as base 11 left join 購入者テーブル as a 12 on base.管理番号=a.管理番号 and base.氏名=a.氏名 13 ) left join 購入回数テーブル as b 14 on base.管理番号=b.管理番号 and base.氏名=b.氏名

投稿2019/09/19 05:45

編集2019/09/19 07:21
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salty_

2019/09/19 07:24

ご回答ありがとうございます!すみません、検証に少しお時間ください。いつもありがとうございます。
guest

0

SQL

1SELECT A,B,C FROM TABLE_A 2UNION ALL 3SELECT D,E,F FRO TABLE_B;

が正しい結果を返すなら、

SQL

1INSERT INTO TABLE_C ( 2 SELECT A,B,C FROM TABLE_A 3 UNION ALL 4 SELECT D,E,F FRO TABLE_B 5);

で、できませんか?

マニュアル:
INSERT INTO ステートメント

投稿2019/09/19 05:05

編集2019/09/19 10:04
nandymak

総合スコア799

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salty_

2019/09/19 07:28

ご回答ありがとうございます!すみません、このINSERT 文ではエラーになってしまいました・・・。
nandymak

2019/09/19 07:29

マニュアルのURLを載せていますので、エラーメッセージを確認してください。
Orlofsky

2019/09/19 10:01

>このINSERT 文ではエラーになってしまいました そのエラー・メッセージを要約しないでそのままここに載せては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問