電子書籍の厳選無料作品が豊富!

次の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)

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

A 回答 (3件)

パッと思いつくのは下記の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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/26 12:03

こんな感じかな



select * from master where (kata,kyaku)
in(
select kata,kyaku from data where hakko in('201303','201305')
having count(distinct hakko) =2
)
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/26 12:02

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



MySQLで積集合演算(intersect)を模倣する
http://codezine.jp/article/detail/3906?p=2
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/26 12:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!