次のテーブルから選択する SQL クエリを実行したいと思います。
id type num
1 a 3
1 b 4
2 a 5
2 c 6
それらが同じ 'id' を持ち、タイプが 'a または b' である場合、結果は次のようになります。
id type num
1 a 3
1 b 4
それをどのように達成できるか、誰にも分かりますか?
次のテーブルから選択する SQL クエリを実行したいと思います。
id type num
1 a 3
1 b 4
2 a 5
2 c 6
それらが同じ 'id' を持ち、タイプが 'a または b' である場合、結果は次のようになります。
id type num
1 a 3
1 b 4
それをどのように達成できるか、誰にも分かりますか?
SELECT table1.*
FROM table1,
(
SELECT COUNT(*) as cnt, id
FROM (
SELECT *
FROM table1
WHERE type = 'a' OR type = 'b'
) sub1
GROUP BY id
HAVING cnt > 1
)sub2
WHERE table1.id = sub2.id
ここでテスト: http://sqlfiddle.com/#!2/4a031/1は正常に動作するようです。
方法 1:
select a.*
from some_table t
join some_table a on a.id = t.id and a.type = 'a'
join some_table b on b.id = t.id and b.type = 'b'
方法 2:
select *
from some_table t
where exists ( select *
from some_table x
where x.id = t.id
and x.type = 'a'
)
and exists ( select *
from some_table x
where x.id = t.id
and x.type = 'b'
)
最初の手法では、id と type のカーディナリティに応じて、結果セットで行が重複する可能性があります。後者は、テーブルの適切なサブセットを提供することが保証されています。
どちらのクエリでも、テーブルに適切なインデックスが定義されていると仮定すると、かなり同等のパフォーマンスが得られるはずです。