2014-02-27 2 views
-2

열이 c1, c2, c3 및 c4 ​​인 테이블이 있습니다. 나는 c1과 c2가 같은 레코드 중에서 max (c3) 레코드를 검색해야하므로이 방법으로이 레코드를 작성한다.동일한 열 값을 공유하는 레코드 그룹 중에서 "최대"레코드를 선택하십시오.

select * 
    from XXX a 
where not exists (
      select 1 
      from XXX b 
      where a.c1 = b.c1 
        and a.c2 = b.c2 
        and a.c3 > b.c3 
     )  

하지만 내 수석은 쿼리가 전체 테이블을 두 번 스캔하므로이 방법이 효율적이지 않다고 말했습니다. 위의 시나리오를 처리하기위한 더 나은 접근 방법은 무엇입니까?

비고 : Oracle 11g를 사용하고 있습니다.

샘플 입력 : c1 c2 c3 c4 1 1 1 a 1 1 2 b 1 1 3 c 2 1 1 d 2 1 2 e

결과 : c1 c2 c3 c4 1 1 3 c 2 1 2 e

+0

C2 맞죠? – TechDo

+0

샘플 입력 및 출력을 제공하면 질문을 명확히하는 데 도움이 될 수 있습니다. – hkutluay

+0

테이블에서 자체 조인을 사용하는 이유를 명확히 할 수 있습니까? 일부 결과물을 통해 질문을 명확하게 설명해 주시겠습니까? – user1658435

답변

1

시도하십시오 :

select c1, 
     c2, 
     c3, 
     c4 
From(
    select 
    XXX.*, 
    row_number() over (partition by c1 order by c3 desc) RNum 
    from XXX 
)x where Rnum=1 

확인 SQL Fiddle Demo 같은 C1 및 C2 수단의 C1의 =으로

+0

SQL이 올바른 대답을했습니다. 하지만 약 150 만 개의 레코드가있는 제 테이블에 해결책을 찾아보십시오. 그 성능은 내 것이 훨씬 더 나빠집니다. – user1664398

+0

@ user1664398 - 한 번만 테이블을 치기 때문에 그럴 것 같지 않습니다. 아마도 귀하의 실제 검색어에 대한 귀하의 적응은 적절하지 않았습니까? 두 쿼리의 실행 계획을 살펴보면 어느 정도 밝혀 질 수 있습니다. –

+0

알렉스, 나는 너에게 동의한다. 그러나 테이블에 잘못된 색인이 작성되어있을 수 있습니다. 어쨌든 TechDo의 답변에 감사드립니다. – user1664398

0

이 시도 :

SELECT MAX(c3) FROM XXX 
WHERE c1=c2 
0

를 내가 이해 여전히 내 인 질문은 당신이 더 나은 방법을 원하는 것입니다 받고 있지 않다 최대 c3 열을 찾으십시오.이 것을 시도하십시오.

Select Max(c3) from XXXa,XXXb where a.c1 = b.c1 
,
0

시도 : 참고로 갖는 사용하여 그룹을 할 수

select max(c3) 
from table_name 
where c1=c2; 
0

...

SELECT C1, C2, C3, XXX GROUP BY C1 FROM 맥스 (C3), C2, C3 HAVING 최대 (C3) = C3는

나는 오라클이 실행하지 않은하지만이 할 수있는 방법이라고 생각 그것.

희망이 도움이됩니다.

관련 문제