2012-09-12 74 views
0

可能重复:
How do you select only the maximum version of a list of documents that have different versions in SQL?如何从SQL文档的列表中选择文档的最大版本?

我有一个表中存储的文件的版本和网页中的文件与

CREATE TABLE tbl (id int, title varchar(32), version int, pageid int); 
insert into tbl values (1, 'file1', 1, 25); 
insert into tbl values (2, 'file2', 1, 25); 
insert into tbl values (3, 'file1', 2, 25); 
insert into tbl values (4, 'file2', 2, 25); 
insert into tbl values (5, 'file3', 1, 25); 
insert into tbl values (6, 'file1', 1, 24); 
insert into tbl values (7, 'file2', 1, 24); 
insert into tbl values (8, 'file1', 2, 24); 
insert into tbl values (9, 'file2', 2, 24); 
insert into tbl values (10, 'file3', 1, 24); 

我想生成相关只返回附加到pageid = 25而不是pageid = 24的文档的最大版本的查询。运行查询应该只产生行3,4,5而不是行8,9,10(因为它们与pageid = 24相关联)。

我已经为这个问题放在一起SQL Fiddle

+0

不完全重复,但相似。我忘记提到更多使上一篇文章中的查询更加复杂的细节,但是正确回答上一篇文章的人却无论如何都有分。 – user1068636

回答

2

下面是其中的伎俩一个简单的查询:

select * 
from tbl t1 
inner join (select title, max(version) as version from tbl where pageid=25 group by 1) t2 on(t1.title=t2.title and t1.version=t2.version) 
where t1.pageid=25 

下面是它的SQL Fiddle output - 它做你想要的?

+0

这个在Oracle 11g上完美运行。 – user1068636

+0

酷 - 我想我会使用标准的SQL来实现最大的可移植性。很高兴听到它的作品。 –

2

假设对这一问题的标签是否正确(您发布的小提琴是MySQL),你可以使用分析功能

SELECT id, title, version, pageid 
    FROM (SELECT t.*, 
       MAX(version) OVER (partition by title) max_version 
      FROM tbl t 
     where pageid=25) 
WHERE version = max_version; 

你可以看到SQL Fiddle for this回报问题三排

+0

您的查询适用于SQL Fiddle网站,但当我在Oracle 11g数据库上输入时,它无法正常工作。 – user1068636

+0

@ user1068636 - 你能详细说明“没有工作”吗?它适用于SQL Fiddle(运行Oracle 11.2)。它使用您的示例数据在我的本地11.2数据库上运行。使用分析函数只需要像我在这里做的那样敲击表格应该比通过进行连接两次敲击表格更有效,因此可能值得了解哪些内容对您不起作用。 –