这是plsql&的一个问题。神谕。我是新来的。请帮忙!
我有2个表:表A和表B
Table A: ID, Date
Table B: Name, Address
如何在两个表之间进行连接,然后根据最新日期返回。此外,它将基于列表中的指定ID。
我当前的查询返回:
1 | 1/1/2013 | Apple | 123 Malcolm
1 | 1/2/2013 | Apple | 123 Malcolm
1 | 1/3/2013 | Apple | 123 Malcolm
3 | 1/1/2013 | Orange| 124 Malcolm
3 | 1/2/2013 | Orange| 124 Malcolm
如何让它返回:
1 | 1/3/2013 | Apple | 123 Malcolm
3 | 1/2/2013 | Orange| 124 Malcolm
select unique(ID), a.Date, b.Name, b.Address
from tableA a
join tableB b
on a.ID = b.ID
where a.Date > TO_DATE('12/31/2012', 'mm/dd/yyyy') and a.ID in ('1', '3')
谢谢!
答案 0 :(得分:3)
您需要group
您的结果集。您还需要一个聚合函数,在本例中为MAX()
这应该有效:
select unique(ID), MAX(a.Date), b.Name, b.Address
from tableA a
join tableB b
on a.ID = b.ID
where a.Date > TO_DATE('12/31/2012', 'mm/dd/yyyy') and a.ID in ('1', '3')
group by ID, b.Name, b.Address
您可以在http://www.w3schools.com/sql
了解这些方法以及更多内容链接到GROUP BY
说明:http://www.w3schools.com/sql/sql_groupby.asp
答案 1 :(得分:2)
有很多方法可以做到这一点:
这是一个。它通过ID获取最大日期的子集,然后将其加入到您已经拥有的内容中,从而限制每个组的最大值。
Select A.ID, A.Date, B.Name, B.Address
FROM A
INNER JOIN B
on A.ID = B.ID
INNER JOIN (Select max(date) maxDate, ID from A group by ID) C
on C.ID=A.ID and C.MaxDate = A.Date
WHERE
A.ID IN ('1','3')
答案 2 :(得分:1)
这种方式使用分析:
select a_id,
a_date,
b_name,
b_address
from (
select a.id as a_id,
a.date as a_date,
b.name as b_name,
b.address as b_address,
rank() over (partition by a.name_id
order by a.date desc) as rnk
from a inner join b on a.id=b.id
where a.id in ('1','3') and
a.date > to_date('12/31/2013','mm/dd/yyyy')
)
where rnk=1
答案 3 :(得分:0)
这是一个快速而简单的解决方案。我假设TableA中的ID和Date形成PK,因此被索引。子查询查找指定ID的最大日期,并由于索引而快速完成。然后该记录用于加入TableB。在查看一系列日期时,我一直使用这种格式来查找最新(最大)或最早(最小)。即使TableA非常大,您也会发现它的速度可以接受。
with
TableA as (
select 1 id, date '2013-01-01' selected from dual union all
select 1, date '2013-01-02'from dual union all
select 1, date '2013-01-03'from dual union all
select 3, date '2013-01-01' from dual union all
select 3, date '2013-01-02' from dual
),
TableB as (
select 1 id, 'Apple' name, '123 Malcolm' addr from dual union all
select 3, 'Orange', '124 Malcolm' from dual
)
-- Here is the query:
select *
from TableB b
join TableA a
on a.id = b.id
and a.selected =(
select Max( selected )
from TableA
where id = a.id
);
答案 4 :(得分:0)
使用像RANK()这样的分析功能将是最好的选择。