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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQL

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

Q&A

解決済

1回答

1750閲覧

特定のテーブルにある複数条件のデータと一致するもののみを、別のテーブルから抜き出したい。

H.K2

総合スコア88

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQL

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

0グッド

0クリップ

投稿2021/05/29 23:15

編集2021/05/30 16:36

前提・実現したいこと

以下の図のように、二つのテーブル(table_joinとlink_table)から、link_tableにある
複数カラムを使って複数の条件(たとえばfile_name, sheet_nameがそれぞれ特定の値)を満たす
物のみをtable_joinから取り出したいです。
イメージ説明

追記:Unique、Primaryは、idにしか設定していません。

お聞きしたいことは下記2点です。
①「該当のソースコード」に記載の内容で書いたところ、エラーは出なかったのですが、
クエリとして上記のユースケースとして問題はないでしょうか。
(上の図ではすごく少ないデータのようなので問題なさそうに見えますが、実データは数十万件の
データであり、想定通りのクエリになっているかの確認が難しいです。)
②①では、table_joinを検索するキーを「id」で行っているのですが、「year」「tag」で行った場合(a.id, c.idを、(a.year and a.tag), (c.year and c.tag)に書き換えた)、検索される件数が変わってしまいます。紐づけ対象として行っているだけなので、結果は等価と思ったのですが、等価にならない理由として想定されるものはどういうことになりますでしょうか。

該当のソースコード

sql

1select a.id, a.a_data1, a.b_data1 from table_join a 2where 3 a.id 4in 5 (select c.id from link_table c where c.file_name = 'ほげほげ.xlsx' 6and 7 c.sheet_name = 'a') 8UNION 9 select a.id, a.a_data1, a.b_data1 10from 11 table_join a 12where 13 a.year >= 2015 14

試したこと

sqlに関して、やりたいことを検索し、MYSQL_workbenchなどでデバッグしてみた。

環境

MySQL workbench 8.0.19

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

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

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

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

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

guest

回答1

0

ベストアンサー

①に対して、集計するというのがクエリーでは実現されていません。
union マージする機能で集計ではありません。

件数については、クエリーの性能を気にされていると思いますが、それは正しいクエリーであると同時に、インデックスも適切でなければなりません。

②について、table_joinとlink_tableの関係はidで1:n(※)なのでしょう。
これに対し、yearとtagではn:nになるので、件数が変わるのは当然です。
※テーブルが分かれているのが正しいなら1:nですが、1:1なら正規化されている状態ではありません。

やりたい事は概ね以下の様なSQLだと思います。

SQL

1select a.year, a.tag, sum(a_data1), sum(b_data2), sum(b_data1), sum(b_data2) 2from table_join a inner join link_table c 3 on a.id=c.id 4where c.file_name = 'ほげほげ.xlsx' 5 and c.sheet_name = 'a' 6 and c.year >= 2015 7group by a.year, a.tag

投稿2021/05/30 03:14

編集2021/05/30 10:10
sazi

総合スコア25173

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

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

H.K2

2021/05/30 08:59

ご回答ありがとうございます!帰ったら確認してみます!
H.K2

2021/05/30 16:07

自分なりに調べてみました。Unionというのは、2クエリの条件を重複除いてANDするということなので、自分が書いたクエリだと、「ファイル名がほげほげであることと、シート名がAであること、あと年度が2015以上」の3条件それぞれをANDして、重複列を削除した、という認識でよいでしょうか。 なので、groupbyがないから「集計はされない」という理解でよいでしょうか。 (集計はされないけど、式としてはANDになっている?) また、groupby でsumを除いた場合は、合計値ではなく、最初の値になっているのでしょうか。 https://gotto50105010.hatenablog.com/entry/2018/12/06/223615
H.K2

2021/05/30 16:15 編集

後すみません。もう一点だけ。とある事情でもし、2テーブル間のseqのみがずれてしまうリスクがある場合(year,tagはずれない、かつ、yearとtagの組み合わせ自体は一意という前提)、onにseqの代わりにyear, tagを指定してもよいでしょうか。 on a.id=c.idの代わりに、on (a.year=c.year and a.tag=c.tag)にかえて、サンプルでやってみたところでは抽出件数が変わらなかったので、問題ないのかとは思いますが、念のためご教示いただけましたら幸甚です。
H.K2

2021/05/30 16:20 編集

あ、なんどもすみません。。。ベン図みたら、ANDではないですね…。「ファイル名がほげほげかつシート名がA」であること または 「yearが2015以上」で、重複除去だから、ご提示いただいたクエリより多くなる、ということなのかな…。
sazi

2021/05/30 16:21

テーブルの定義を質問に追加して下さい。(プライマリーおよびユニーク制約など) 結合して良いかとか集計して良いかなどは、そういった情報が無ければ答えられません。
sazi

2021/05/30 16:24

union の理解はまだできていないようですね。 unionするだけで条件が別の集合に付加されることはありません。
H.K2

2021/05/30 16:56 編集

すみません。追記しました。primaryとuniqueはidにしかありません。(mysqlが自動で出力する) ただ、運用の問題だと思うのですが、2テーブルのidがずれてしまうときがあり、同じIDでも別のものをさしてしまうことがある(片方のテーブルのIDの更新が追従しないときがある)ので、仕組み上一意になる、「yearとtagの組み合わせ」でonできないのかなと思った次第です。(year単独では一意にはならないですが、その場合、andを付けたとしても、onで結合したらまずいのでしょうか。)
sazi

2021/05/30 17:01

「yearとtagの組み合わせ」が一意なら、idの代わりの結合条件にしても大丈夫ですけど、それなら何故テーブルを分けているんでしょうね。
H.K2

2021/05/30 17:04

2つのテーブルを別々のツールで変更しているからだと思います。 (仕組み上はまずいとは思うのですが、いろいろとあってかえられない様なので…。 ともあれ、ありがとうございます。UNIONは、pythonのpandasのところで図解があったので、なんとなくイメージがつかめました。確かに自分が書いたクエリではだめそうですね。ありがとうございます!) https://ai-inter1.com/pandas-dataframe_union/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問