hasManyのテーブルの対象1行のみとjoinする

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

めずらしいSQLを見たのでメモ

1対多のテーブルとjoinして、Many側の最大、または最小のレコードのみjoin対象とする時、

SELECT * 
FROM
  master m
  JOIN rows r on m.id = r.master_id 
  AND not exists (select 1 from rows r2 where r2.id > r.id and r2.master_id = r.master_id)


where r2.id > r.id and r2.master_id = r.master_id

この条件で、r1より大きい同一のmaster_idがあれば行を返す

not exists で 行があれば結合しない

となり、Many側のmaster_id内の最大idレコードのみ結合レコード対象となる。

existsサブクエリを駆動表分投げるから重いんじゃないのかなあ。と思いつつ、自分の環境ではgroup byサブクエリより早かったりした。(駆動表、内部表ともに100万レコードないくらい)

こういう発想なかったのでメモしておきます。