2012-09-12 24 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數據庫上運行。使用分析函數只需要像我在這裏做的那樣敲擊表格應該比通過進行連接兩次敲擊表格更有效,因此可能值得了解哪些內容對您不起作用。 –