PLSQL&;Oracle-加入2个表并仅基于最新日期返回
这是一个plsql和oracles的问题。我是新来的。请帮忙 我有两张桌子:A桌和B桌PLSQL&;Oracle-加入2个表并仅基于最新日期返回,sql,oracle,plsql,Sql,Oracle,Plsql,这是一个plsql和oracles的问题。我是新来的。请帮忙 我有两张桌子: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
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')
谢谢 有很多方法可以做到这一点: 这是一个。它根据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')
有很多方法可以做到这一点: 这是一个。它根据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')
您需要对结果集进行分组。您还需要一个聚合函数,在本例中为
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
你可以阅读这些方法,更多信息请访问
通过说明链接到分组:
链接到MAX()
说明:您需要对结果集进行分组。您还需要一个聚合函数,在本例中为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
你可以阅读这些方法,更多信息请访问
通过
说明链接到分组:
链接到MAX()
说明:这种方式使用分析:
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
这种方式使用分析:
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
这里有一个快速而简单的解决方案。我假设TableA中的ID和日期构成PK,因此被索引。子查询查找指定ID的最大日期,并根据索引快速执行。然后使用该记录连接到表B。我在查看一系列日期以查找最新日期(Max)或最早日期(Min)时一直使用这种格式。即使表格很大,你也会发现它的速度可以接受
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
);
这里有一个快速而简单的解决方案。我假设TableA中的ID和日期构成PK,因此被索引。子查询查找指定ID的最大日期,并根据索引快速执行。然后使用该记录连接到表B。我在查看一系列日期以查找最新日期(Max)或最早日期(Min)时一直使用这种格式。即使表格很大,你也会发现它的速度可以接受
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
);
使用像RANK()这样的分析函数将是最好的选择。使用像RANK()这样的分析函数将是最好的选择。比我想象的要简单得多。@xQbert heh,我看了你的例子,认为“嗯,这看起来很有趣”。我从来不知道你可以在JOIN
内部执行select
…等等,哦,你JOIN
执行select
语句的结果。这是一件有趣的事情。工作得很有魅力!!谢谢@SteffenWinkler我在想分组会有问题,这会阻止它工作。我看见你的,就说;DUH分组没有问题,因为ID在表A中是重复的。如果我们必须获得一个唯一的ID,我的方法是有效的,而这可能不是。@xQbert true。但在这种情况下,数据库会违反第一个标准形式。比我想象的要简单得多。@xQbert heh,我看了你的例子,认为“嗯,这看起来很有趣”。我从来不知道你可以在JOIN
内部执行select
…等等,哦,你JOIN
执行select
语句的结果。这是一件有趣的事情。工作得很有魅力!!谢谢@SteffenWinkler我在想分组会有问题,这会阻止它工作。我看见你的,就说;DUH分组没有问题,因为ID在表A中是重复的。如果我们必须获得一个唯一的ID,我的方法是有效的,而这可能不是。@xQbert true。但在这种情况下,数据库将违反第一个标准形式。