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

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

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

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

Q&A

解決済

3回答

2323閲覧

指定した複数列で重複データを表示しないSELECT文の書き方

iorin

総合スコア32

MySQL

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

0グッド

0クリップ

投稿2018/02/20 06:12

前提・実現したいこと

以下のようなテーブルがあった場合に特定複数列のカラム(ここではA_No,B_No,Date)が重複するデータを全件取得しないようなSQLを書きたいです。
※カラムを一部抜粋しています

-- 仕様 --
・Kbnは1もしくは2のどちらか(3以上は存在しない)
・必ず1から作られる(2のみ存在することはあり得ない)

+--|---|------|------|--------+
|ID|Kbn|A_No |B_No |Date |
+--|---|------|------|--------+
|1 |1 |X00001|0 |20180220|
|2 |2 |X00001|0 |20180220|
|3 |1 |X00001|1 |20180220|
|4 |2 |X00001|1 |20180220|
|5 |1 |X00001|2 |20180220|
|6 |2 |X00001|2 |20180220|
|7 |1 |X00001|3 |20180220|
|8 |2 |X00001|3 |20180220|
|9 |1 |X00001|4 |20180220|
+--|---|------|------|--------+

理想の結果
+--|---|------|------|--------+
|ID|Kbn|A_No |B_No |Date |
+--|---|------|------|--------+
|9 |1 |X00001|4 |20180220|
+--|---|------|------|--------+

ユーザーの処理によって次に作成されるレコードは以下
ただし、作成されない可能性もあります。
+--|---|------|------|--------+
|ID|Kbn|A_No |B_No |Date |
+--|---|------|------|--------+
|10|2 |X00001|4 |YYYYMMDD|
+--|---|------|------|--------+

もし、このレコードが作成された場合にはSELECTしてもEmpty Setになってほしいです。

DISTINCTやGROUP BYで試してみたんですが上手くいかず、以下のような結果になってしまい困っています。

SELECT *FROM TableName WHERE Order_No = 'X00001' GROUP BY A_No ,B_No ,Date;

+--|---|------|------|--------+
|ID|Kbn|A_No |B_No |Date |
+--|---|------|------|--------+
|1 |1 |X00001|0 |20180220|
|3 |1 |X00001|1 |20180220|
|5 |1 |X00001|2 |20180220|
|7 |1 |X00001|3 |20180220|
|9 |1 |X00001|4 |20180220|
+--|---|------|------|--------+

わかりにくい質問で申し訳ないですがご教授ください。

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

MySQL 5.5.34

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

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

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

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

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

unz.hori

2018/02/20 06:17

Empty Setになって欲しい場合の条件が良くわからないです。Dateが'YYYYMMDD'ってこと?
unz.hori

2018/02/20 06:18

単純にIDが最大でA_Noが'X00001'のレコードを抽出したいってこと?
iorin

2018/02/20 06:25

わかりにくい記述ですみません。dateにはその処理を実行した日付が入ります。
unz.hori

2018/02/20 06:28

わかりにくいと自覚しているならば、わかり易く説明をする努力をしないと正しい回答は得られません。
guest

回答3

0

検索結果のグループ化 (GROUP BY と HAVING)
HAVING COUNT(*) = 1 で重複を除きます。

投稿2018/02/20 06:22

Orlofsky

総合スコア16415

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

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

iorin

2018/02/20 06:44

回答ありがとうございました。
guest

0

ベストアンサー

こんな感じでしょうか?

  • 元データ

SQL

1 2create table tbl(ID int ,Kbn int, A_No char(6),B_No int, `Date` date); 3insert into tbl values 4(1,1,'X00001',0,'20180220'), 5(2,2,'X00001',0,'20180220'), 6(3,1,'X00001',1,'20180220'), 7(4,2,'X00001',1,'20180220'), 8(5,1,'X00001',2,'20180220'), 9(6,2,'X00001',2,'20180220'), 10(7,1,'X00001',3,'20180220'), 11(8,2,'X00001',3,'20180220'), 12(9,1,'X00001',4,'20180220');
  • 抽出
select * from tbl as t1 where exists( select A_No,B_No,Date from tbl group by A_No,B_No,Date having count(*)=1 and t1.A_No=A_No and t1.B_No=B_No and t1.Date=Date );

投稿2018/02/20 06:21

yambejp

総合スコア114769

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

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

iorin

2018/02/20 06:44

ありがとうございます。上手くいきました。
guest

0

ベストアンサー出ましたが、、、

提示の内容からすると、

B_No毎でKbnが1しか存在しないレコード

のように受け取れますが、
だとすると重複とか関係なく以下でいけるかと。。

SQL

1SELECT * FROM TableName A WHERE A.Order_No = 'X00001' 2AND NOT EXSITS ( 3 SELECT * FROM TableName B WHERE B.Order_No = 'X00001' 4 AND B.Kbu = 2 5 AND A.ID = B.ID 6)

ただデータのバリエーションが少ないですね。
仮にID:10のKbnが1だった場合、
空行を期待していますか?それとも1行結果がでることを期待していますか?
おそらく、havingを使ったものだと空行になります。

投稿2018/02/20 06:48

szk.

総合スコア1400

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

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

iorin

2018/02/20 07:12

データの抜粋が少なくすみません。。 >仮にID:10のKbnが1だった場合 というのは +--|---|------|------|--------+ |ID|Kbn|A_No |B_No |Date | +--|---|------|------|--------+ |10|1 |X00001|5 |20180220| +--|---|------|------|--------+ このようなデータが追加された場合ということでしょうか?
szk.

2018/02/20 07:16

それだとB_Noも変わってますよね。 Kbnが1で同じB_Noはないという仕様であれば、havingで問題ないです。 あとはhavingにしたことでiorinさんが理解できたが問題です。
iorin

2018/02/20 07:49

>Kbnが1で同じB_Noはないという仕様であれば、havingで問題ないです。 Kbnが1で同じB_Noが存在する可能性はありますが、その場合は必ずA_Noが異なります。 例のA_Noが全て同じだったためにわかりにくかったですね、すみません。 havingについて調べてみて何となくは理解出来たつもりではいますが、 まだまだ浅い理解なのでしっかりと覚えてきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問