2014-05-08 74 views
0

我有两个表。帐户表和交易表。我想列出所有账户与他们的最后交易。由于没有事务的情况下可能存在需要左连接。SQL左外部加入一对多行

我有类似

select * from Account ac left join Transaction trans on ac.id = trans.acc_id 

但是,这将列出所有的交易数据。不知道如何修改它。

+1

什么字段的交易将被用来知道这是最后一个? – geoand

+0

交易表中'id'字段的@geo和max值。 –

回答

2

第一左连接让你帐户的最后\最大事务ID。第二个左连接为您获取最后一个ID的所有交易信息。

select ac.*, lasttrans.* 
from Account ac 
left join (select acc_id, max(id) as id from Transaction group by acc_id) transmax 
    on ac.id = transmax.acc_id 
left join Transaction lasttrans on lasttrans.id = transmax.id 
0

沿着只需使用一个aggregate功能与group by

select * from 
from Account ac left join Transaction trans 
on ac.id = trans.acc_id 
where trans.id in (select max(id) from trans group by ac.id) 

编号或日期这有史以来的是,你想获得的max的列..

+0

由于我们使用group by by ac.id,因此我们无法在此查询中查找其他列,例如交易金额等。我们可以使用max func获取tran id/date。 –

+0

@AkhilKNambiar:现在检查...编辑答案 –

+0

不......只是一个问题,当我把数量。有时没有交易,那么该数据没有列出 –

2

您可以通过连接Account表试试只有交易表的acc_id对应于每个acc_id的最大ID:

 select ac.*, t.* from Account ac left join (select acc_id, max(id) from Transaction group by acc_id) trans on ac.id = trans.acc_id left join Transaction t on trans.id=t.id 
+0

无法取得交易金额等字段,因为使用了group by。 –

+0

请添加关于您提供的单线解决方案关键方面的说明。 – Rachcha

+0

@AkhilKNambiar:交易金额等交易表的一个字段? –

0

这是否接近你在期待什么?

with acc as 
(select 1 acc_id, 'name1' acc_name from dual union 
select 2 acc_id, 'name2' acc_name from dual union 
select 3 acc_id, 'name3' acc_name from dual), 
trans as 
(select 1 trans_id, 1 trans_acc_id, 'transaction detail 1' transdtl from dual 
union 
select 2 trans_id, 1 trans_acc_id, 'transaction detail 2' transdtl from dual 
union 
select 3 trans_id, 1 trans_acc_id, 'transaction detail 3' transdtl from dual 
union 
select 4 trans_id, 3 trans_acc_id, 'transaction detail 4' transdtl from dual 
union 
select 5 trans_id, 5 trans_acc_id, 'transaction detail 5' transdtl from dual 
) 
select * from acc, trans 
where acc.acc_id = trans.trans_acc_id 
and trans.trans_id in (select max(trans_id) from trans inner_trans where 
inner_trans.trans_acc_id = acc.acc_id) 

他们的回应是:

ACC_ID|ACC_NAME|TRANS_ID|TRANS_ACC_ID|TRANSDTL 
1 |name1 |3 |1 |transaction detail 3 
3 |name3 |4 |3 |transaction detail 4 
+0

此查询只提取在trans表中至少有一个事务的帐户。你是否需要也没有任何交易的账户细节? –