- ベストアンサー
サブクエリの使い方
- テーブルt1とt2にデータが登録されており、t1type毎に一番新しいdateをもつt2codeを抽出したいが、次郎と五郎が適切に抽出されない。
- 質問者はサブクエリを使用して解決しようとしたが、次郎と五郎が正しく抽出されない理由が分からない。
- 質問者はタイトル『サブクエリの使い方』で、t1type毎に一番新しいdateをもつt2codeを抽出する件について指摘して欲しい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SELECT DISTINCT t2_code,date FROM t1 INNER JOIN t2 ON t1_code=t2_code WHERE (t1_type,date) IN(SELECT t1_type,MAX(date) FROM t1 INNER JOIN t2 ON t1_code=t2_code GROUP BY t1_type) でどうでしょうか。
その他の回答 (1)
- root139
- ベストアンサー率60% (488/809)
かなり冗長ですが、下記の様なSQLでご希望の結果が出ると思います。 SELECT DISTINCT t21.* FROM t1 t11 INNER JOIN t2 t21 ON t1code = t2code WHERE NOT EXISTS ( SELECT * FROM t1 t12 INNER JOIN t2 t22 ON t1code = t2code WHERE t11.t1type = t12.t1type AND t21.date < t22.date ) 結合したデータ中で t1type が同じで date が自分より後のものが無いものだけに絞り込んでいます。 太郎と花子には、同一の date のデータが存在するので DISTINCT で重複を消しています。 > どこが悪いのでしょうか? t1type でグループ化して t2code を出力していますが、MySQL では GROUP BY で指定されていない項目を SELECT句に指定すると同じグループの中に存在する値の中のどれかになります。(下記ページ参照) http://dev.mysql.com/doc/refman/5.1/ja/group-by-hidden-fields.html ですから、t2code は t1code が同じものの中の『何か』になってしまいます。
お礼
すみません。 補足に書いてしまいました。 ありがとうございます。
補足
こちらでもうまく行きました。 しかし、理解するのに時間がかかりそうです。 NOT EXISTS..... 又、新しい課題が..... じっくり勉強させて頂きます。 >GROUP BY で指定されていない項目を >SELECT句に指定すると同じグループの >中に存在する値の中のどれかになります なるほどです。 どうもありがとうございました。
お礼
すみません。 このサイトの使い方がいまいちわかってなくて、補足に書いてしまいました。 ありがとうございます。
補足
ありがとうございます。 うまく行きました。 サブクエリがなんとなく理解できそうです。