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

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

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

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

Q&A

解決済

1回答

2718閲覧

複数レコードを跨いだ条件を指定したSELECT方法

mychikin

総合スコア1

SQL

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

0グッド

0クリップ

投稿2020/08/02 15:59

A,B,Cさんが存在し、それぞれの特徴を持つテーブルXがあります。

<テーブルX>
user | attr
-----+-------
A | pretty
A | cool
A | beauty
B | pretty
C | pretty
C | beauty

テーブルXからprettyでbeautyな特徴を保有するuserを抽出したいのですが、
select文の書き方がわかりません。
上の例だと、AさんとCさんが抽出結果になります。

以下のSQLを考えたのですが、これだとbeautyを保持しないCさんも抽出されてしまいます。

sql

1select distinct user from X where attr in ('pretty', 'beauty');

ご教示、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SQL

1select distinct user from X t 2where exists(select 1 from X where user=t.user and attr ='pretty') 3 and exists(select 1 from X where user=t.user and attr ='beauty')

ですね。

(user,attr)で一意なら以下の様な記述でも同様な結果になります。

SQL

1select distinct user from X t 2where (select count(*) from X where user=t.user and attr in ('pretty', 'beauty'))=2

性能重視で考えると以下の記述も

SQL

1select user from x 2group by user 3having count(case when attr in ('pretty', 'beauty') then 1 end)=2

投稿2020/08/02 17:50

編集2020/08/03 04:00
sazi

総合スコア25206

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

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

mychikin

2020/08/02 22:57

抽出できました! こういう時にexists使うんですね。勉強になりました。 ありがとうございます。
mychikin

2020/08/03 03:48

なるほど、countを使う方法もあるんですね。 個人的にはexistsを使う方が、クエリからやりたいことがわかる気がするのでこちらを選択することにします。 データが増えてきて処理時間がかかるようになったら、 2つを比較して性能の良い方を選択したいと思います。 複数の方法をご教示いただきありがとうございます。
sazi

2020/08/03 04:01

> 個人的にはexistsを使う方が、クエリからやりたいことがわかる気がする そうですね。 そう思っての回答でしたが、意欲がありそうなので追記しました。 性能も気にされているようなので、パターンを追加しておきました。
mychikin

2020/08/03 14:21

そんなトリッキーなやり方もあるんですね! 思いつきもしませんでした。 副問合せがない分、3つの中では一番性能が出そうですね。SQL面白いです。 ご教示いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問