SQLiteの面白さ(17) 複数列のサブクエリ

MySQLなんかでたまにやる
SELECT * FROM t1 WHERE (col1, col2, col3) = (SELECT col1, col2, MAX(col3) FROM t1);
というような複数列のサブクエリを、SQLiteでもできないかと思い、試してみた。
col1、col2に生徒の成績関連のデータが入っていてcol3に試験の日付が入っているような場面で、それぞれの生徒の最新の成績だけを抽出したいといった場合に使うクエリだ。生徒によっては最近の試験を欠席しているかも知れないのでその場合はそれに次ぐ直近の試験の成績を表示したい、という条件がつくとこのようなクエリになる。
なお、このようなクエリはMySQLのマニュアルでは Row Subqueries と呼ばれている。日本語訳は「行副問い合わせ」となっていた。

で、これをSQLiteで試したところ、うまくいかなかった。構文エラーになってしまう。

ならば結果は同じということで、
SELECT * FROM t1 INNER JOIN (SELECT col1, col2, MAX(col3) AS col3 FROM t1) AS t2 ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 AND t1.col3 = t2.col3;
といった感じでSQLを書き換えたところ、こちらはエラーにならず動作してくれた。結果も意図どおりだった。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック