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

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

詳細はこちら
MySQL

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

SQL

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

Q&A

解決済

1回答

723閲覧

MySQL 8.0で2つの類似したテーブルから重複なしでSELECTしたい

beyond_the_avg

総合スコア6

MySQL

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

SQL

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

0グッド

1クリップ

投稿2019/10/30 23:45

編集2019/10/30 23:58

MySQL 8.0で2つの類似したテーブルから重複なしで情報を得たい

2つの異なる方法で集計したテーブルA, Bがあります。集計方法が異なるので100%一致はしませんが、概ね同じ種類のデータ(対象、期間)が記録されています。つまりテーブルAとBにまったく同じデータが記録されていることもあります。

テーブルA, Bには複数のcolumnがありますが、重要なのは name と timestamp です。もう一つ division 列もありますが、テーブルAでは欠損値であることがあります。

nameとdivisionはVARCHARです。
timestampはDATETIMEです。

テーブルA, Bは類似したデータを異なる方法で記録していますので、大半は重複したデータです。ここでは name が一致していたら重複としてください。timestampは数秒の誤差があります。

テーブルA

name, timestamp, division taro, 2019-08-28 09:54:17, company_x jiro, 2019-09-28 09:54:17, company_y saburo, 2019-10-28 09:54:17, company_y

テーブルB

name, timestamp, division jiro, 2019-09-28 09:54:19, company_y saburo, 2019-10-28 09:54:14, company_y ichiro, 2019-10-29 09:54:14, company_z

があったときに

taro, 2019-08-28 09:54:17, company_x jiro, 2019-09-28 09:54:17, company_y saburo, 2019-10-28 09:54:17, company_y ichiro, 2019-10-29 09:54:14, company_z

を得るのが目的です。timestampはどちらの値を使用しても構いませんが、taroはテーブルAにしかなく、ichiroはテーブルBにしかいないので両方出力しても構いません。

発生している問題・エラーメッセージ

Column 'name' in field list is ambiguous.

など。

あるいは1000件以上出るはずが100件しか出なかったり、すべての組み合わせが生成され36万件くらい出力される。

試したこと

SQLの例を探して類似の事例からSQLを作ろうとした。例えば

https://qiita.com/KentFujii/items/f25bcb5f5ca7d7db1c9c

などを読んだが、多くの事例では異なる種類のテーブルの結合だったり「重複した値」のみ抽出の例が多く、SQLの基礎知識のない自分では自分に合わせてカスタマイズできなかった。

補足情報(FW/ツールのバージョンなど)

MySQLを使用しています。バージョンは8.0です。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

name が重複しないようにしたいということであれば、
table A にある name の集合+ table B にあり table A にない name の集合
で、望みの name の集合は得られるはずです。

なので

SQL

1SELECT 2 name, timestamp, division 3FROM tableA 4UNION ALL 5SELECT 6 name, timestamp, division 7FROM tableB 8WHERE name not in (SELECT DISTINCT name FROM tableA)

で行けるかな?

ただし、tableA と tableB の双方にデータがあった場合、tableA 側が優先されます。
tableB 側を優先したいなら、上記の SQL の tableA と B を逆にしてください(B + (A-B)を作る)

投稿2019/10/31 00:07

tacsheaven

総合スコア13703

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

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

beyond_the_avg

2019/10/31 00:19

ありがとうございます。教えていただいたSQL文で期待通りに動作しました。優先度はtable Aで問題ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問