Oracle:获取具有相同日期的最后一条记录

时间:2018-12-01 15:22:36

标签: mysql sql oracle

我正在尝试建立查询以获取可以在MySQL,Oracle 10和12中使用的最新记录。

场景: 我有4个表格-客户,地址,贷款,申请 我想加入这4个表以获取应用程序的客户名称和地址。

客户,贷款和申请之间存在1对1的关系 而客户和地址之间存在一对多的关系。

select count(c.name)
from application
left join loan on (loan.id = application.id)
inner join customer on (loan.cust_num = customer.id); 

这将提供100行;

select count(c.name)
from application
left join loan on (loan.id = application.id)
inner join customer on (loan.cust_num = customer.id)
inner join address a1 on (loan.cust_num = address.cust_num)
inner join (
select max(date) as max_date, cust_num
from address
where address_type = 'studio'
group by cust_num 
) a2
on a1.cust_num = a2.cust_num
and a1.date = a2.max_date;

这将提供200条记录,因为在某个日期的地址中,有1条以上的记录的客户的address_type为'studio'。

如何获取最新记录。

最后,我想要一个应用程序的地址表中的地址列和客户表中的名称。

谢谢。

1 个答案:

答案 0 :(得分:0)

对于适用于Oracle和MySQL的代码,我建议使用相关子查询:

select count(c.name)
from application a join
     loan l
     on o.id = a.id join
     customer c
     on l.cust_num = c.id left join
     address ad
     on ad.cust_num = l.cust_num and
        ad.address_type = 'studio' and
        ad.date = (select max(ad2.date)
                   from address ad2
                   where ad2.cust_num  = ad.cust_num and
                         ad2.address_type = ad.address_type
                  );

如果您正在使用MySQL 8+或不需要MySQL,则应按照Tim的建议使用row_number()

请注意,我删除了left joinjoincustomer正在使用loan中的字段,该字段将外部联接变为内部联接。您也可以表达实际执行的逻辑。