Access VBAのSQLで、列数が異なる2つのテーブルをUNION ALLしたいです


今、「T_メニュー一覧」と「T_新メニュー一覧」という2つのテーブルがあります。

――――
select 商品名,店舗ID,単価
from T_メニュー一覧

union all

select 商品名,店舗ID,単価
from T_新メニュー一覧
――――

によって、1つのテーブルにまとめあげることはできるのですが。
https://f.hatena.ne.jp/moon-fondu/20210707162744

実は「T_メニュー一覧」の方にあります「メニューID」という列も表示させたいのです。
「T_新メニュー一覧」の方には、「メニューID」という列はなく、新規に作成することもできません。

「T_新メニュー一覧」に列を追加することなく、UNION ALLとは別に「T_メニュー一覧」の方にあります「メニューID」列を表示させることは、できないでしょうか。

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2021/07/14 16:21:09
id:moon-fondu

自分の方で調べましたころ、


異なる定義のテーブルでUNION ALLするには?|teratail

https://teratail.com/questions/130157


を参考にし、「サブクエリを使えばいいのかな?」と思いまして。


――――

select a.商品名,a.店舗ID,a.単価,a.メニューID

from(

select 商品名,店舗ID,単価

from T_メニュー一覧

union all

select 商品名,店舗ID,単価

from T_新メニュー一覧) a

――――


を、実行してみたのですが。

しかしこちらの画像 https://f.hatena.ne.jp/moon-fondu/20210707163040 にありますように、「a.メニューID」のパラメーターの入力を求めるダイアログが出てきしまいます。


何かいい方法がありましたらお教えいただけますと有り難いです。

Accessのファイルはこちらになります。

https://xfs.jp/i2Ie1D


よろしくお願い致します。

ベストアンサー

id:a-kuma3 No.1

回答回数4934ベストアンサー獲得回数2137

ポイント2000pt

質問で書かれていることをやりたいなら、こんな感じです。

select 商品名,店舗ID,単価,メニューID from T_メニュー一覧

union all

select 商品名,店舗ID,単価,-1 as メニューID from T_新メニュー一覧

カラムが足りない方のテーブルを select する方で、ダミーの値を補ってあげる。

例では -1 としましたけれど、空文字列 ("") でも、Null でも、"ダミーメニューID" みたいな文字列でもお好きなものを指定してください。




とは言え、列数すら違うテーブルを union で結合するのは地雷でしかないような気はします...

実物は、どんなやつなんだろう...


あと、teratail の回答にもありましたけど、かなり乱暴な結合なので、どっちのテーブルから引っこ抜いたのかの目印は入れておくべきだろうとは思います。

他1件のコメントを見る
id:a-kuma3

カラム名が重複するテーブルを join してるので、select するカラム名には

テーブルの指定が必要です。

select T_メニュー一覧.商品名,T_メニュー一覧.店舗ID as TI,T_メニュー一覧.単価,メニューID
from T_メニュー一覧
left join
(select 商品名, 店舗ID as TI,単価
from T_新メニュー一覧) NM
on T_メニュー一覧.店舗ID = NM.TI

あと、もうひとつ問題があって、on の NM.店舗ID がダメです。

select で as を使って名称を変えているので、NM.TI にする

必要があります。

2021/07/14 12:20:08
id:moon-fondu

うまくいきました!ありがとうございます(^^;)

「式の方が一致しない」と出てきましたが、デザインビューでデータ型を確認しましたら「数値型」になってないフィールドがありましたので、それを直したら問題なかったです。

selectするカラム、いつも悩むのですが、

――――――――――

select *

from T_メニュー一覧

left join

(select 商品名, 店舗ID as TI,単価

from T_新メニュー一覧) NM

on T_メニュー一覧.店舗ID = NM.TI

――――――――――

みたいに全部選ぶと、楽ですね!

一旦、全部選んでどの列が必要かを確認して、selectの箇所を書き換えようと思います。

2021/07/14 16:20:49

その他の回答0件)

id:a-kuma3 No.1

回答回数4934ベストアンサー獲得回数2137ここでベストアンサー

ポイント2000pt

質問で書かれていることをやりたいなら、こんな感じです。

select 商品名,店舗ID,単価,メニューID from T_メニュー一覧

union all

select 商品名,店舗ID,単価,-1 as メニューID from T_新メニュー一覧

カラムが足りない方のテーブルを select する方で、ダミーの値を補ってあげる。

例では -1 としましたけれど、空文字列 ("") でも、Null でも、"ダミーメニューID" みたいな文字列でもお好きなものを指定してください。




とは言え、列数すら違うテーブルを union で結合するのは地雷でしかないような気はします...

実物は、どんなやつなんだろう...


あと、teratail の回答にもありましたけど、かなり乱暴な結合なので、どっちのテーブルから引っこ抜いたのかの目印は入れておくべきだろうとは思います。

他1件のコメントを見る
id:a-kuma3

カラム名が重複するテーブルを join してるので、select するカラム名には

テーブルの指定が必要です。

select T_メニュー一覧.商品名,T_メニュー一覧.店舗ID as TI,T_メニュー一覧.単価,メニューID
from T_メニュー一覧
left join
(select 商品名, 店舗ID as TI,単価
from T_新メニュー一覧) NM
on T_メニュー一覧.店舗ID = NM.TI

あと、もうひとつ問題があって、on の NM.店舗ID がダメです。

select で as を使って名称を変えているので、NM.TI にする

必要があります。

2021/07/14 12:20:08
id:moon-fondu

うまくいきました!ありがとうございます(^^;)

「式の方が一致しない」と出てきましたが、デザインビューでデータ型を確認しましたら「数値型」になってないフィールドがありましたので、それを直したら問題なかったです。

selectするカラム、いつも悩むのですが、

――――――――――

select *

from T_メニュー一覧

left join

(select 商品名, 店舗ID as TI,単価

from T_新メニュー一覧) NM

on T_メニュー一覧.店舗ID = NM.TI

――――――――――

みたいに全部選ぶと、楽ですね!

一旦、全部選んでどの列が必要かを確認して、selectの箇所を書き換えようと思います。

2021/07/14 16:20:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません