質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

20336閲覧

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

sakura-shi

総合スコア93

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/06/08 05:30

編集2018/06/08 05:38

前提・実現したいこと

■table_a
create table table_a (
modifydate date,
code varchar(5) default null,
name varchar(255) default null
);
■table_b
create table table_b (
modifydate date,
code varchar(5) default null,
name varchar(255) default null,
type varchar(1) default null
);

2つのテーブルがある場合、
SELECT * from table_a
UNION ALL
SELECT * from table_b
order by modifydate desc;

という結果がほしいのですが、両テーブルでは定義が少し異なります。

このように定義が異なる場合、UNIONするにはどのようなSQLにすればよいでしょうか?、

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

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

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

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

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

guest

回答4

0

SQLの記述は他の方がされているので、補足的な回答を。

UNIONはSQLでの問い合わせ時に正規化を行うようなものです。

ですので、正規化されたテーブルに、unionそれぞれのデータをinsertするつもりで記述して下さい。

具体的には、最低でも項目の並び、属性を合わせる必要があります。
考慮が必要なのは、一意キーが異なるもののUNIONです。
キーレベルを合わせるのに集計(group by)も必要になったりします。
※今回は不要そうですが
項目の並びや属性は先頭に記述するselect文で決まります。

投稿2018/06/08 06:52

sazi

総合スコア25173

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

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

0

ベストアンサー

  • まずは型が違うものは用途が違うので、UNIONするという考え方がおかしい

という前提を抑える必要があります。

  • その上で、select *は精度を欠くのであまり使わないほうが賢明です
  • 加えて、unionにorder byはあまりおすすめできません。

結合後にサブクエリとしてソートしたほうがよいでしょう。

  • 最後に、運用に際して違うテーブルをUNIONするのに、どちらのテーブルから取得したか付加しなくてもよいのでしょうか?

総じて・・・

SQL

1SELECT * FROM( 2SELECT 'A' as tbl,modifydate,code,name,'' as type from table_a 3UNION ALL 4SELECT 'B',modifydate,code,name,type from table_b 5) as sub order by modifydate desc;

''がいいのかnullがいいのかは運用方針に合わせてください

投稿2018/06/08 05:45

yambejp

総合スコア114769

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

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

0

同じ形になるようにすればいいでしょう

SQL

1SELECT *, null as type from table_a 2UNION ALL 3SELECT * from table_b 4order by modifydate desc

投稿2018/06/08 05:36

x_x

総合スコア13749

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

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

0

UNION ALL の上下の列数は同じくなければエラーになります。
typeの内容に ? がないものとして、

SQL

1SELECT 2 a.modifydate 3 , a.code 4 , a.name 5 , CASE WHEN a.type = '?' THEN null 6 ELSE a.type 7 END AS type 8FROM( 9 SELECT *, '?' as type from table_a 10 UNION ALL 11 SELECT * from table_b 12 ) a 13order by a.modifydate desc;

みたいな記述にされては?

投稿2018/06/08 05:46

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問