2012-09-12 3 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 = 25에 첨부 된 문서의 최대 버전 만 나에게 돌려주는 쿼리. 쿼리를 실행하면 행이 3,4,5가되고 행이 8,9,10이 아닐 수 있습니다 (페이지 ID = 24와 연결되어 있기 때문에).

이 문제는 SQL Fiddle입니다.

+0

정확하게 중복되지는 않지만 유사합니다. 이전 게시물에서 쿼리를 복잡하게하는 자세한 정보는 잊어 버렸지 만 이전 게시물에 답변 한 사용자는 포인트를 얻었습니다. – user1068636

답변

2

여기에 트릭을 수행하는 간단한 쿼리입니다 : 그 SQL Fiddle output의 여기

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 

을 그리고는 - 당신이 찾고있는 무엇을합니까?

+0

Oracle 11g에서 완벽하게 작동합니다. – user1068636

+0

멋지다 - 최대의 이식성을 위해 표준 SQL을 사용할 것이라고 생각했습니다. 그것을 듣고 행복하게 작동합니다. –

2

질문에 태그, 당신은

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 반환에게 세 가지 행을 볼 수있는 분석 기능을 사용할 수 있습니다 (당신이 게시 된 바이올린은 MySQL을위한) 올바른지 가정

+0

쿼리는 SQL Fiddle 사이트에서 작동하지만 Oracle 11g 데이터베이스에 입력하면 작동하지 않습니다. – user1068636

+0

@ user1068636 - "작동하지 않았다"에 대해 자세히 설명해 주시겠습니까? SQL Fiddle (Oracle 11.2를 실행 중)에서 작동합니다. 그것은 샘플 데이터와 함께 내 로컬 11.2 데이터베이스에서 작동합니다. 여기서 한 것처럼 분석 함수를 사용하면 표를 두 번 치는 것보다 테이블을 두 번 누르는 것보다 훨씬 효율적입니다. 그래서 당신에게 효과적이지 않은 것을 이해할 가치가 있습니다. –

관련 문제