2017-04-12 1 views
1

그래서 내가 오라클에이 두 테이블이 두 번 선택 문제 :오라클

pa_id pa_date  pa_status cl_id 
1  2017-01-01  1   1 
2  2017-01-01  1   2 
3  2017-02-01  1   1 
4  2017-02-01  1   2 
5  2017-03-01  0   1 
6  2017-03-01  1   2 

내가 나에게 클라이언트 ID, NAME를 제공하고 선택 statemant 필요

CLIENT

cl_id cl_name 
1  John 
2  Maria 

지불 그의 마지막 지불의 상태. 그래서 내 선택의 최종 결과는 같아야합니다

을 :

select cl_id, cl_name from CLIENT;

이 작품을 선택 지불의 마지막 상태입니다 :

cl_id cl_name pa_status 
1  John  0 
2  Maria 1 

이 작품을 선택 클라이언트입니다 select * from ( select pa_status from PAYMENT ORDER BY PA_DATE DESC) where rownum = 1;

이제는 함께 작동시켜야합니다.

select cl_id, cl_name, (select * from ( select pa_status from PAYMENT ORDER BY PA_DATE DESC) where rownum = 1 and PAYMENT.cl_id = CLIENT.CL_ID) as last_status from CLIENT;

오류 : 유효하지 않은 식별자

이 : 나는 작동하지 않았다 두 가지 방법을 시도하지만, 나에게 오류를 제공하지 않습니다

select cl_id, cl_name, (select * from ( select pa_status from PAYMENT ORDER BY PA_DATE DESC) where rownum = 1) as last_status from CLIENT;

마지막 레코드 인 John의 마지막 최종 상태를 보여줍니다.

아무도 내게 힌트를 줄 수 있습니까?

감사

답변

1

분석 기능을 사용해야합니다. 이러한 종류의 함수를 사용하면 데이터를 일부 그룹으로 분할하고 원하는대로 각 그룹의 데이터의 순위를 매길 수 있습니다. 귀하의 경우에는

:

Select * from (
Select id, name, status, row_number() over (partition by  p.cl_id order by p.pa_date desc) as rw 
From client c join payments p on p.cl_id = c.cl_id) 
Inn where inn.rw = 1; 
+0

그게 잘 됐어. 감사! – Sambarilove

+0

위대한. FIRST 분석 기능을 찾으려면 더 나은 구문이 있습니다. 행운을 빕니다! – user2671057

0

이 클라이언트 의 최대 날짜를 가져온 다음 해당 날짜에 가장 높은 지불 ID를 가져옵니다.

with max_date as (
     select max(date) as max_date, cl_id from payments group by cl_id 
) 
select c.cl_id, c.cl_name, p.pa_sttus from client c 
join payments p 
on c.cl_id = p.cl_id 
where p.pa_id = (select max(p2.pa_id) from payments p2 
        join max_date md 
        on p2.cl_id = md.cl_id 
        where p.cl_id = p2.cl_id 
        and p2.pa_date = md.max_date 
       ) 
+0

마지막 줄에 잘못된 식별자가 나타납니다. "md.pa_date" – Sambarilove

+0

잘못된 열 이름을 사용했습니다. 지금 일해야합니다. – gorrilla10101

0

먼저 각 클라이언트 ID에서 날짜의 최대 걸릴.

select cl_id, c.cl_name, last_payment.status 
from client 
join 
(
    select 
    cl_id, 
    max(pa_status) keep (dense_rank last order by pa_date) as status 
    from payments 
    group by cl_id 
) last_payment using (cl_id); 

(당신이 지불하지 않고 클라이언트를 포함 할 경우, 변경 :

Select cl_id, max(pa_date) as pa_date from PAYMENTS group by cl_id 

이제

select c.cl_id, c.cl_name, 
(select pa_status from PAYMENT t where t.pa_date=p.pa_date and t.cl_id=p.cl_id) 
from CLIENT c join (Select cl_id, max(pa_date) as pa_date from PAYMENTS group by cl_id) p on p.cl_id=c.cl_id 
0

당신은 오라클의 KEEP LAST 여기를 사용할 수 있습니다 통해 UR 클라이언트 테이블을 가지고 위의 하위 쿼리에 가입 조인은 LEFT OUTER JOIN입니다.)