• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLのinの使い方)

SQLのinの使い方

このQ&Aのポイント
  • SQLのin句を使ったクエリの最適化方法を教えてください。
  • マスタとデータテーブルを結合し、特定の発行年月に該当するデータを抜き出す方法について知りたいです。
  • クエリの無駄を減らし、処理速度を向上させる方法を教えてください。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.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

toshi_2000
質問者

お礼

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

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

こんな感じかな select * from master where (kata,kyaku) in( select kata,kyaku from data where hakko in('201303','201305') having count(distinct hakko) =2 )

toshi_2000
質問者

お礼

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

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

MySQLは最新版でもまだintersectはできないのでしたっけ? MySQLで積集合演算(intersect)を模倣する http://codezine.jp/article/detail/3906?p=2

toshi_2000
質問者

お礼

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

関連するQ&A