Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PLSQL&;Oracle-加入2个表并仅基于最新日期返回_Sql_Oracle_Plsql - Fatal编程技术网

PLSQL&;Oracle-加入2个表并仅基于最新日期返回

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

这是一个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/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。但在这种情况下,数据库将违反第一个标准形式。