0

Oracleデータベース(11Gだと思います)でのSQLクエリに問題があります。

2つのテーブルでクエリを実行する必要があります。最初のものには、人の識別子が含まれています。2つ目は、支払い(給与と見なすことができます)を含み、各レコードは外部キーを持つ人に関連付けられています。

私がする必要があるのは、既知の人のリスト(たとえば、識別子1、2、5、および10)について、最も古い支払い(支払い日に基づく)を取得することです。

私が最初に作ったのはこれです:

select id_person, MIN(payment_date) 
from payment where id_person in (1, 2, 5, 10)
group by id_person;

これは次のようなものを取得します:

1   19940623
2   20100429
5   20100204
10  20100111

さて、各人について、最も古い支払いに対応する「支払い」テーブルの完全な記録を取得するにはどうすればよいですか?

これを行う方法がわかりません...

答えは単一のSQLクエリである必要があります(私は各人に電話をかけることはできません。これは非常に簡単です...)

4

3 に答える 3

1

試す

 select * from payment p
 where id_person in (1, 2, 5, 10)
    And payment_date =
       (Select Min(payment_date)
        From payment
        Where id_person = p.id_person)

あなたのコメントに基づく:支払いテーブルにキー(主キーまたは一意のインデックス)があれば、解決は簡単です。もしそうなら、キーが列paymentIdにあると言ってください。

 select * from payment p
 where id_person in (1, 2, 5, 10)
    And paymentId =
       (Selcet paymentId From payment p2
        Where id_person = p.id_person
           And payment_date =
             (Select Min(payment_date)
              From payment
              Where id_person = p.id_person))
于 2012-11-02T15:40:55.100 に答える
1

どうですか

SELECT * FROM Payment INNER JOIN (
    SELECT id_person, MIN(payment_date) 
    FROM payment p 
    WHERE id_person IN (1, 2, 5, 10)
    GROUP BY id_person;
    )
    ON Payment.id_person = p.idPerson AND Payment.payment_date = p.payment_date
于 2012-11-02T15:42:53.507 に答える
1

これでうまくいくはずです。

select *
from (
   select id_person, 
          payment_date,
          row_number() over (partition by id_person order by payment_date) as rn
   from payment
   where id_person ind (1,2,5,10)
) t
where rn = 1
于 2012-11-02T19:40:44.613 に答える