2017-03-06 2 views
0

고객 & 프로파일 2 테이블에 합류했습니다. 두 테이블 모두 특정 열 cust_id로 조인됩니다. 프로필 표에는 1 개 이상의 항목이 있습니다. 두 테이블을 조인 할 때 start_ts (column)로 가장 최근 엔트리를 선택하고 싶습니다. 결과적으로 고객의 1 행 - 행과 결과 세트의 프로필의 가장 최근 행을 원합니다. 이 ORACLE SQL을 수행 할 수있는 방법이 있습니까? (모든 DB 엔진 작동)조인의 일부로 가장 최근 레코드 가져 오기

답변

3

나는 것 윈도우 함수를 사용 : 당신은뿐만 아니라 프로파일이없는 고객을 얻을 좋아하는 경우에 당신은 left join을 사용할 수 있습니다

select . . . 
from customer c join 
    (select p.*, 
      row_number() over (partition by cust_id order by start_ts desc) as seqnum 
     from profile 
    ) p 
    on c.cust_id = p.cust_id and p.seqnum = 1; 

. @juergen

select 
    c.*, 
    p.* 
from 
    customer c inner join 
    profile p on p.cust_id = c.cust_id and not exists(
     select * 
     from profile 
     where cust_id = c.cust_id and start_ts > p.start_ts 
    ) 
+1

@PunterVicky - Oracle과 함께 일하면서 둘 이상의 참여를 사용하는 다른 사용자에 대해 Gordon의 솔루션을 테스트 할 수 있습니다. Gordon의 솔루션은 훨씬 더 효율적 (더 빠름)합니다. 분석 기능이 꽤 표준 임에도 불구하고 오라클에게 큰돈을 지불하는 이유는 다른 SQL 데이터베이스 제품에는없는 추가 기능입니다. 분석 함수는 쿼리에서 시간 소모적 인 조인 횟수를 줄이는 특정 목적으로 도입되었습니다. – mathguy

+0

감사합니다. @Gordon & mathguy. 나는 이것을 밖으로 시도 할 것이다! –

2

한 가지 방법은 데이터를 필터링 할 데이터를 선택하고 profile의 특정 최대 레코드에 가입 할 테이블을 조인하는 것입니다

select c.*, p.* 
from customer c 
join profile p on c.cust_id = p.cust_id 
join 
(
    select cust_id, max(start_ts) as maxts 
    from profile 
    group by cust_id 
) p2 on p.cust_id = p2.cust_id and p.start_ts = p2.maxts 
+0

감사 : 여기 –

+0

"모든 DB 엔진에서 작동하는"것은 좋은 일일 수 있지만 좋지 않을 수도 있습니다. 오라클 제품에 막대한 돈을 투자한다면 모든 DB 엔진에서 반드시 사용할 수있는 Oracle 기능을 활용할 수도 있습니다. 이 경우 분석 함수는 반복 조인보다 더 빠른 솔루션을 제공합니다. – mathguy

+0

동의 함 ....... –

1

는 (다음 더 새로운 항목이 존재하지 않는 경우는 최신의) 또 다른 방법입니다. 나는 이것을 시도 할 것이다.
+0

감사합니다 @maraca !! –

관련 문제