- ベストアンサー
SQLのinの使い方
- SQLのin句を使ったクエリの最適化方法を教えてください。
- マスタとデータテーブルを結合し、特定の発行年月に該当するデータを抜き出す方法について知りたいです。
- クエリの無駄を減らし、処理速度を向上させる方法を教えてください。
- みんなの回答 (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
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
こんな感じかな select * from master where (kata,kyaku) in( select kata,kyaku from data where hakko in('201303','201305') having count(distinct hakko) =2 )
お礼
回答ありがとうございます。 参考にさせていただきます。
- jjon-com
- ベストアンサー率61% (1599/2592)
MySQLは最新版でもまだintersectはできないのでしたっけ? MySQLで積集合演算(intersect)を模倣する http://codezine.jp/article/detail/3906?p=2
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。 aの方法でうまくいきました。 ほしいSQLがすぐ書けるようになりたいものです。