2013-09-22 3 views
1

직장에서 외래 키 당 최대 상태를 자주 찾아야합니다. 대부분의 경우 조인에 대해 상관 관계가있는 하위 쿼리를 사용하여 올바른 레코드를 얻었습니다. 가장 높은 기본 키가 가장 최근의 키라고 가정합니다. 여기에 약간의 데모

외래 키당 테이블의 최대 레코드를 찾는 가장 좋은 방법은 무엇입니까?

select 
    c.plate_number, o.name 
from 
    Car c 
    inner join Owner o 
     on o.owner_id = (
      select max(owner_id) 
      from Owner 
      where owner_type = 'PRIMARY' 
     ) 


이 꽤 빨리 내가 ​​입력 열에 대한 하위 쿼리에서 별도의 기준을 넣을 수있는 언급하지 않기 위하여 사용하는 대부분의 쿼리에에게 있습니다. NOT EXIST 절을 사용하여 상위 레코드가 없는지 확인했지만 다른 것을 찾을 수 없습니다. 누군가가 더 나은 것을 제안 할 수 있습니까? 그렇다면 그 이유는 무엇입니까? 나는 sandard의 윈도우 기능을 사용하는 것이 좋습니다

+0

을 얻을 무엇이든 얻을 수 있습니다 테이블? –

+0

최근 레코드를 원한다면 날짜 시간 필드를 사용하십시오. 그렇다면 가정을 할 필요가 없습니다. –

+0

정확하게 이해한다면 쿼리가 한 행만 반환한다는 의미입니까? –

답변

0

....

;with cte as (
    select c.plateNumber, o.name, 
      row_number() over (partition by c.ownerId order by purchaseDate desc) rw 
    from car c 
     inner join owner o 
      on o.ownerid = c.ownerid 
) 
select * 
from cte 
where rw=1; 

당신이 자동차와 소유자 사이의 관계는 무엇 테이블 중 하나에서 원하는, 여전히 하나 개의 레코드 만

+0

나는 내 질문에 대해 분명히해야만했다. 상위 레코드 당 가장 최근의 하위 레코드를 일대 다 관계로 가져오고 싶습니다. – user1281598

+0

이것이 바로 이것이 허용하는 것입니다. 선택하고자하는 열을 행 수와 함께 넣고 "최근"을 정의하는 데 사용하는 열을 순서대로 지정하면됩니다. 전체 열 목록이 없으면 "구입 한"열이 있다고 가정했지만 사용하는 ID는 마지막으로 업데이트 할 수 있습니다. – jmoreno

+0

필자는 가장 높은 레코드가 가장 최신 인 표준으로 PK를 사용합니다. 그러나 주된 지점으로 되돌아 가면 윈도우 기능/순위 지정 기능을 사용하는 버전이 무엇이 더 좋을까요? – user1281598

관련 문제