我正在尝试建立查询以获取可以在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'。
如何获取最新记录。
最后,我想要一个应用程序的地址表中的地址列和客户表中的名称。
谢谢。
答案 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 join
。 join
至customer
正在使用loan
中的字段,该字段将外部联接变为内部联接。您也可以表达实际执行的逻辑。