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

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

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

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

SQL

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

Q&A

解決済

2回答

2025閲覧

重複したデータを抽出させないSQL

yoshi7

総合スコア48

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/01/13 01:46

編集2018/01/13 02:34

同一テーブル、または別テーブルに重複したデータが存在していれば、
それを抽出するCSVリストを作成したいと考えております。

ID SEI MEI 010 山田 太郎 020 鈴木 敏夫 030 田中 哲男 040 山本 雅人 050 島田 次郎 060 斉藤 剛史 070 山田 太郎 080 大島 大輔 090 田中 哲男 100 斉藤 剛史 110 山田 太郎

例えば上記のようなテーブルがあった場合、
SEIとMEIが重複するIDを抽出して、どのIDとどのIDが重複しているかがわかるCSVにしたいので、
下記のような結果になるSQLを模索中です。

ID SEI MEI 重複ID 010 山田 太郎 070 010 山田 太郎 110 030 田中 哲男 090

070と090、110のIDも抽出するSQLであれば容易に考えられるのですが、
それらは重複IDの方に表示するの抽出したくないのです。

尚、070と090、110のIDを抽出するSQLは下記になります。

SELECT a.ID, a.SEI, a.MEI, b.ID AS 重複ID FROM TABLE_A a INNER JOIN TABLE_A b ON a.SEI = b.SEI AND a.MEI = b.MEI

これを実行すると、抽出結果は下記のようになります。

ID SEI MEI 重複ID 010 山田 太郎 070 010 山田 太郎 110 030 田中 哲男 090 070 山田 太郎 010 070 山田 太郎 110 090 田中 哲男 030 110 山田 太郎 010 110 山田 太郎 070

例えば、IDが070のところで重複IDが010として表示されていますが、
010と070が重複していることは、
IDが010のところで重複IDが070と表示されているので既に判明しています。
なので、 抽出したくないのです。

いいSQL文はないでしょうか?

追記
説明が不足していましたが、実際にはIDに付随する住所や電話番号等も抽出項目になります。

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

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

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

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

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

hichon

2018/01/13 01:54

重複IDが2個以上ある場合はどうしますか?
sousuke

2018/01/13 02:13

070と090がなぜ重複IDに表示されないのかを理論的に説明してください。固定文字列なら「070と090のIDも抽出するSQLであれば容易に考えられる」のであればそこからwhere句で抜くしか無いです。
guest

回答2

0

ベストアンサー

下記でどうでしょう。

SQL

1SELECT a.*, b.ID AS 重複ID 2 FROM 3 (SELECT min(ID) AS ID, SEI, MEI FROM TABLE_A GROUP BY SEI, MEI HAVING COUNT(*) > 1) a 4 INNER JOIN TABLE_A b 5 ON a.SEI = b.SEI AND a.MEI = b.MEI 6WHERE a.ID <> b.ID 7ORDER BY a.ID;

重複のある最小IDをとりだすサブクエリと結合して、IDが同じものは除外する。

結果

IDSEIMEI重複ID
010山田太郎070
010山田太郎110
030田中哲男090
060斉藤剛史100

動作サンプル
SQL Fiddle

投稿2018/01/13 02:56

hatena19

総合スコア33610

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

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

yoshi7

2018/01/13 05:06

ありがとうございました。助かりました。
guest

0

重複が3つ以上ある可能性もあるため以下のような形にしてみました

sql

1SELECT SEI, MEI, GROUP_CONCAT(ID) AS 重複ID FROM table GROUP BY SEI, MEI HAVING COUNT(*) > 1;

こうなります

SEIMEI重複ID
山田太郎010,070
田中哲男090,070

投稿2018/01/13 02:07

teng

総合スコア127

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

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

yoshi7

2018/01/13 02:38

SQLありがとうございます。 追記させてもらったんですが、 実際にはSEIとMEI以外にも住所や電話番号も取得したいと考えています。 その場合は先頭IDに紐づくデータにしたいので、ご提示いただいたSQLだと、 難しいのかなと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問