次の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)
無駄があるようで、また速度向上したいのですが、どう記述していいか分かりません。
教えてください。
パッと思いつくのは下記の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/907http://codezine.jp/article/detail/405?p=2
お礼
回答ありがとうございます。 aの方法でうまくいきました。 ほしいSQLがすぐ書けるようになりたいものです。