0

在 Oracle 数据库(我认为是 11G)上进行 SQL 查询时遇到问题。

我需要对两个表进行查询。第一个包含人员的标识符。第二个包含付款(您可以将其视为工资),每条记录都与具有外键的人相关联。

我需要做的是检索已知的人员列表(比如说标识符 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 回答