こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLのinの使い方

次の2つのテーブルがあります。

テーブル master
形式kata
客先kyaku
コードcode

テーブル data
形式kata
客先kyaku
発行年月hakko
数量suryo

発行年月が201303と201305の両方があるマスタを抜き出したいため、次のSQLを考えました。

select m.kata,m.kyaku,m.code from master m join data d on m.kata=d.kata and m.kyaku=d.kyaku where 201303 in (select d.hakko from data d where m.kata=d.kata and m.kyaku=d.kyaku)
and 201305 in (select d.hakko from data d where m.kata=d.kata and m.kyaku=d.kyaku)

無駄があるようで、また速度向上したいのですが、どう記述していいか分かりません。
教えてください。

投稿日時 - 2013-06-25 11:46:07

QNo.8149016

困ってます

質問者が選んだベストアンサー

パッと思いつくのは下記の2つほどですね。

a. 相関サブクエリを使う方法

SELECT * FROM master m
WHERE (
SELECT COUNT(DISTINCT hakko) FROM data d
WHERE m.kata = d.kata AND m.kyaku = d.kyaku AND hakko IN (201303, 201305)
) >= 2

WHERE句では、一つ一つの master レコードについて、 kata と kyaku が同じで hakko が 201303 か 201305 の data レコードを取り出し、その hakko の値が2種類以上有るかどうか調べています。DISTINCT が付いているのは hakko に同じ値が複数有っても1つと数えるためです。


b. 結合してHAVING句で判定する方法

SELECT m.kata, m.kyaku, m.code
FROM
master m join data d on m.kata = d.kata and m.kyaku = d.kyaku
GROUP BY m.kata, m.kyaku, m.code
HAVING
SUM(CASE hakko WHEN 201303 THEN 1 ELSE 0 END) >= 1 AND
SUM(CASE hakko WHEN 201305 THEN 1 ELSE 0 END) >= 1

master と data を結合したものを master の項目でグループ化し、HAVING句で hakko が 201303 のものと 201305 のものが存在するか判定しています。


性能的には、どちらも今一つかも知れません・・・。

MySQL version 5.5.8 で確認しました。


http://codezine.jp/article/detail/907
http://codezine.jp/article/detail/405?p=2

投稿日時 - 2013-06-26 02:25:12

お礼

回答ありがとうございます。
aの方法でうまくいきました。
ほしいSQLがすぐ書けるようになりたいものです。

投稿日時 - 2013-06-26 12:03:28

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

こんな感じかな

select * from master where (kata,kyaku)
in(
select kata,kyaku from data where hakko in('201303','201305')
having count(distinct hakko) =2
)

投稿日時 - 2013-06-25 13:28:21

お礼

回答ありがとうございます。
参考にさせていただきます。

投稿日時 - 2013-06-26 12:02:10

ANo.1

MySQLは最新版でもまだintersectはできないのでしたっけ?

MySQLで積集合演算(intersect)を模倣する
http://codezine.jp/article/detail/3906?p=2

投稿日時 - 2013-06-25 12:59:27

お礼

回答ありがとうございます。

投稿日時 - 2013-06-26 12:04:14

あなたにオススメの質問