2017-04-12 20 views
1

は、だから私は、Oracle上でこれらの2つのテーブル持って、二重の選択問題:オラクル

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;

をこの作品の選択PAYMENTの最後の状態である:

cl_id cl_name pa_status 
1  John  0 
2  Maria 1 

これは動作しますCLIENT選択であります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;

エラー:無効な識別子

この:私は動作しませんでした2つの方法を試してみましたが、唯一、私にすべてのエラーを与えていない

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;

最後のレコードであるジョンの同じ最後のステータスを示します。

誰も私にヒントを与えることができますか?

おかげ

答えて

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

まず、各clientidのための日付の最大値を取ります。

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

今、あなたはあなたがここにOracleのKEEP LASTを使用することができますウルクライアントテーブルを取り、上記のサブクエリで

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

に参加:

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); 

(あなたが支払いせずにクライアントを含めたい場合は、変更をjoin to LEFT OUTER JOIN。)