IN
Postgresql、MySql、Oracle などのタプル対応の RDBMS を使用している場合。次のアプローチを使用できます。
したがって、次のような既存のビューが既にあるとしましょう。
create view page_latest as
SELECT page_url, MAX(last_modified) recentDate
FROM tbl
GROUP BY page_url;
select * from page_latest;
出力...
| PAGE_URL | RECENTDATE |
---------------------------------------------
| abc.com | October, 01 2010 10:00:00+0000 |
| xyz.com | October, 04 2010 12:10:00+0000 |
...このデータに基づく:
| PAGE_URL | LAST_MODIFIED | MESSAGE |
------------------------------------------------------------------
| abc.com | October, 01 2010 10:00:00+0000 | no alarm |
| xyz.com | October, 04 2010 12:10:00+0000 | no surprises |
| xyz.com | October, 04 2010 12:00:00+0000 | fake plastic trees |
| xyz.com | October, 04 2010 10:00:00+0000 | creep |
| abc.com | October, 01 2010 08:00:00+0000 | thom yorke |
前述の RDBMS のタプル対応 IN で上記のビューを再利用することにより、最新のメッセージをすべて見つけることができます: http://www.sqlfiddle.com/#!2/b8193/2
select *
from tbl
where (page_url,last_modified) in (select page_url, recentDate from page_latest);
出力:
| PAGE_URL | LAST_MODIFIED | MESSAGE |
------------------------------------------------------------
| abc.com | October, 01 2010 10:00:00+0000 | no alarm |
| xyz.com | October, 04 2010 12:10:00+0000 | no surprises |
クエリが短くなるだけでなく、読みやすくなります。ただし、ビューが横たわっていない場合は、クエリで「ビュー」をインライン化できます: http://www.sqlfiddle.com/#!2/b8193/5
select *
from tbl
where (page_url,last_modified) in
(SELECT page_url, MAX(last_modified) recentDate
FROM tbl
GROUP BY page_url);
この回答は、Sql Server では機能しません。Tuple-capable をサポートしていないデータベースはごくわずかですがIN
、残念ながら Sql Server はその 1 つです。