在Oracle数据库上遇到SQL查询问题(我认为是11G)。
我需要对两个表进行查询。第一个包含人的标识符。第二个包含付款(您可以将其视为工资),每个记录与具有外键的人相关联。
我需要做的是检索已知的人员名单(比如标识符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查询中(我无法为每个人打电话,这很容易做到......)
答案 0 :(得分: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))
答案 1 :(得分: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
答案 2 :(得分: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