如果您使用的是具有元组功能的 RDBMS,IN
例如 Postgresql、MySql 和 Oracle。您可以使用以下方法。
因此,假设您已经拥有这样的现有视图:
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 就是其中之一