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

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

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

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

SQL

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

Q&A

解決済

4回答

1638閲覧

SQLのコードをシンプルにしたい

osakana1990

総合スコア16

MySQL

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

SQL

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

0グッド

1クリップ

投稿2020/02/19 13:08

編集2020/02/20 00:22

本当に初歩的な質問で申し訳ありませんが、調べても自力で解決出来なかったため質問させていただきます。

現在、年月毎に複数に分けて管理されているテーブルをUNION ALLで1つに結合する処理を書いています。
一旦3ヶ月分取り出して結合する処理を書いたのが以下のコードです。

SQL

1select * from table_A 2left join table_B_201911 on table_A = table_B_201911.id 3left join table_C_201911 on table_A = table_C_201911.id 4where table_A.name = 'Sample' 5union all 6select * from table_A 7left join table_B_201910 on table_A = table_B_201910.id 8left join table_C_201910 on table_A = table_C_201910.id 9where table_A.name = 'Sample' 10union all 11select * from table_A 12left join table_B_201909 on table_A = table_B_201909.id 13left join table_C_201909 on table_A = table_C_201909.id 14where table_A.name = 'Sample'

上記の書き方だとテーブルを増やせば増やすほどコードが長くなってしまい大変なので
例えばJavascriptに置けるユーザー定義関数のような書き方でシンプルに書きたいのですが、
SQLでも同じようなことは可能なのでしょうか・・・?

私の知識不足でどのように調べたら解決策にたどり着くかもわからないため、
大変恐縮ですが何かしらのヒントでもご教示いただけますと幸いです。
よろしくお願い致します。

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

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

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

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

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

m.ts10806

2020/02/19 13:16

想定されるDBはどれでしょうか。
osakana1990

2020/02/20 00:23

情報不足しており大変失礼しました!MySQLです。
guest

回答4

0

ベストアンサー

テーブル名から年月毎にテーブルを分けたのが敗因です。
年月情報を含んだ列を追加ひてひとつのテーブルにまとめます。

union allやunionを多用しなければならないのは質問のように本来一つのテーブルにまとめるべき情報を分割してしまったことに尽きます。

なお、同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、バージョンも明記した方が適切なコメントが付き易いです。SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう!

投稿2020/02/19 13:16

Orlofsky

総合スコア16417

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

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

osakana1990

2020/02/20 00:31

ご回答ありがとうございます。 なるほど、そもそものDBの設計が適切でなかったのですね、、 勉強になりました、ありがとうございます! (データベースのご指摘もありがとうございます。タグを追加いたしました。)
guest

0

年月ごとのテーブルがあるのであれば、それは正規化されていないので(postgresでのパーティションを除く)、動的にSQL文を組み立てる(プログラムでSQL文を生成)しかありません。

取り敢えず、現状のSQLを簡潔にするとしたら

SQL

1select * 2from table_A 3 left join ( 4 select * from table_B_201911 5 union all select * from table_C_201911 6 union all select * from table_B_201910 7 union all select * from table_C_201910 8 union all select * from table_B_201909 9 union all select * from table_C_201909 10 ) table_B_C 11 on table_A.id = table_B_C.id 12where table_A.name = 'Sample'

※上記のunionしているインラインビュー部分が、正規化または可変になる部分です。

投稿2020/02/19 13:43

編集2020/02/20 00:36
sazi

総合スコア25300

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

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

osakana1990

2020/02/20 00:28

ご回答ありがとうございます! DBの設計自体があまり適切でなかったようですが、アドバイスいただいたSQL文の生成は自分の勉強として調べてみます!
osakana1990

2020/02/20 00:43

コードの提示までしていただきありがとうございます! 元々のものよりかなり作業しやすくなりました。
guest

0

  • テーブルを細分化して
  • left joinして
  • union allする

という3重苦ですから、根本的なテーブル設計からみなおしてください

投稿2020/02/20 00:27

yambejp

総合スコア116466

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

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

yambejp

2020/02/20 00:28

MySQLのタグ付があるので、table_B/Cはパーティショニングして 論理的にはひとつに、物理的には月ごとにわけることで 効率化は履かれます
osakana1990

2020/02/20 00:33

ご回答ありがとうございます。 そもそものテーブル設計が適切でなかったのですね、、 table_B/Cのパーティショニングは調べて試してみます!
guest

0

例えばJavascriptに置けるユーザー定義関数のような書き方でシンプルに書きたいのですが、

SQLでも同じようなことは可能なのでしょうか・・・?

table_B や table_C を必要なだけ union する部分を
view で用意すればシンプルには書けますが、
用意する手間をどう考えるかによりますかね。

上記の部分をサブクエリにする方法もありますが、
多少(論理的に)見やすくなるかもしれませんが、
コードの量的には大差なさそげ。

投稿2020/02/19 14:14

takasima20

総合スコア7460

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

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

osakana1990

2020/02/20 00:26

ご回答ありがとうございます! そもそものDBの設計があまり適切でなかったのが原因だったようですが、アドバイスいただいた点は自分の勉強として試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問