oracle:获取最后一条日期相同的记录

3zwjbxry  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(382)

我正在尝试构建一个查询,以获取可以在mysql、oracle10和oracle12中使用的最新记录。
场景:我有4个表-customer,address,loan,application我想连接这4个表以获得应用程序的客户名称和地址。
客户、贷款和申请有1对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条记录,因为在一个日期的地址中,有多条记录的地址类型为客户的“studio”。
如何获取最新记录。
最后,我希望应用程序的address表中有address列,customer表中有name。
谢谢。

qni6mghb

qni6mghb1#

对于同时适用于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,那么您应该使用mysql row_number() 正如蒂姆所说。
注意,我删除了 left join . 这个 joincustomer 正在使用中的字段 loan ,将外部联接转换为内部联接。您还可以表示实际实现的逻辑。

相关问题