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

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

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

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

Q&A

解決済

3回答

1000閲覧

他に該当するレコードがないものだけを取得するSQL(SQLを簡潔にしたい)

azuapricot

総合スコア2341

MySQL

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

0グッド

0クリップ

投稿2019/05/15 09:12

いつもお世話になっております。

今回は自分で書いたSQLがどうも冗長に見えるので皆様のご助力をいただきたいなと思って質問させていただきました。

やりたいことは以下となります。

以下のテーブルから、カラムBが100の物を取得
ただし、カラムBが100でないレコードが存在した場合はそのデータは取得しない
(日本語がわかりにくくてすみません)

カラムAカラムB
1100
2100
2200
3100
4100
5100

上記の例だと カラムA の「2」は 100 と 200 を持っているので取得したくありません。

想定取得結果は以下です。

カラムAカラムB
1100
3100
4100
5100

これを自分で書いてみると以下のようになりました。

MySQL

1SELECT * FROM 'テーブル' where 'カラムB' = 100 AND 'カラムA' not in ( 2 SELECT 'カラムA' FROM 'テーブル' where 'カラムB' <> 100 AND 'カラムA' in ( 3 SELECT 'カラムA' FROM 'テーブル' where 'カラムB' = 100) 4 )

上記のSQLでも問題なく結果は取得できたのですが、めちゃめちゃ冗長な気がしてます。
もっとコンパクトに書く方法はあるのでしょうか。

お時間ある方よろしければご教示を宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

重複データは考慮しないとして
シンプルにこんなのは如何でしょう?

SQL

1SELECT カラムA, MAX(カラムB) AS カラムB 2FROM table 3GROUP BY カラムA 4HAVING MAX(カラムB) = 100 AND MIN(カラムB) = 100

投稿2019/05/15 09:55

hihijiji

総合スコア4150

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

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

0

SQL

1SELECT * FROM 'テーブル' t1 2where 'カラムB' = 100 3 and not exists( 4 select 1 from 'テーブル' 5 where 'カラムB' <> 100 and 'カラムA'=t1.'カラムA' 6 )

投稿2019/05/15 09:31

sazi

総合スコア25138

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

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

0

ベストアンサー

100を複数持っているデータがあったらどうするのでしょうかね?
こんな感じ

SQL

1create table tbl(id int primary key,col1 int,col2 int); 2insert into tbl values 3(1,1,100), 4(2,2,100), 5(3,2,200), 6(4,3,100), 7(5,4,100), 8(6,4,100), 9(7,4,100), 10(8,5,100), 11(9,6,200);
  • すべてのデータを表示

SQL

1select * from tbl as t1 2where not exists(select 1 from tbl where col1=t1.col1 and col2<>100)
  • ユニークにcol1だけひろう

SQL

1select col1 from tbl 2group by col1 3having sum(col2<>100)=0

投稿2019/05/15 09:26

yambejp

総合スコア114581

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

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

azuapricot

2019/05/15 11:11

ありがとうございます!真ん中のやつを使うと思っていたように取得でき、かなりコンパクトになりました! 大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問