PLSQL& Oracle - 加入2个表,仅根据最新日期返回

时间:2014-06-17 19:34:42

标签: sql oracle plsql

这是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')   

谢谢!

5 个答案:

答案 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

链接到MAX()说明:http://www.w3schools.com/sql/sql_func_max.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()这样的分析功能将是最好的选择。