SQl查询:需要在子记录中获取最新创建的数据

时间:2012-02-17 09:30:11

标签: sql oracle

我有一个要求,我需要在子记录中获取最新创建的数据。

假设有两个表A和B. A是父,B是子。他们有1:M的关系。两者都有一些列,B表有一个'创建日期'列,它也保存表B中记录的创建日期。

现在,我需要编写一个查询,它可以从A表中获取所有记录,并从B表中获取最新创建的子记录。假设如果今天在表B中为父记录创建了两个子记录,则应该获取最新的一个记录。

A表的一个记录可能有很多孩子,所以我们怎样才能实现这个目标。

结果应为 - tbl A列,tbl B列(最新创建的一列)

4 个答案:

答案 0 :(得分:1)

我希望'创建日期'是DATETIME列。这将为您提供最新的儿童记录。假设父表中具有一致的ID,子表中的ParentID与外键相同....

select A.*, B.*
from A 
join B on A.ParentID = B.ParentID
join (
  select ParentID, max([created date]) as [created date]
  from B
  group by ParentID
  ) maxchild on A.ParentID = maxchild.ParentID 
where B.ParentID = maxchild.ParentID and B.[created date] = maxchild.[created date]

答案 1 :(得分:0)

以下是可以帮助您的查询。

select x, y from ( select a.coloumn_TAB_A x, b.coloumn_TAB_B y from TableA a ,
TableB b where a.primary_key=b.primary_key
and a.Primary_key ='XYZ' order by b.created_date desc) where rownum < 2

此处我们有两个表AB,根据主键加入它们,按照降序排列表B的创建日期列。

将此输出用作外部查询的内联视图,并选择您想要的任何颜色x,y。其中rownum < 2(将获取表B的最新记录)

答案 2 :(得分:0)

这不是最有效的,但可以工作(仅限SQL):

    SELECT [Table_A].[Columns], [Table_B].[Columns]
    FROM [Table_A]
    LEFT OUTER JOIN [Table_B]
    ON [Table_B].ForeignKey = [Table_A].PrimaryKey
    AND [Table_B].PrimaryKey = (SELECT TOP 1 [Table_B].PrimaryKey
                                FROM [Table_B]
                                WHERE [Table_B].ForeignKey = [Table_A].PrimaryKey
                                ORDER BY [Table_B].CREATIONDATE DESC)

答案 3 :(得分:0)

您可以使用analytic functions避免多次点击每个表格(或具体为B

使用CTE为AB提供虚拟数据,您可以这样做:

with A as (
    select 1 as id from dual
    union all select 2 from dual
    union all select 3 from dual
),
B as (
    select 1 as a_id, date '2012-01-01' as created_date, 'First for 1' as value
        from dual
    union all select 1, date '2012-01-02', 'Second for 1' from dual
    union all select 1, date '2012-01-03', 'Third for 1' from dual
    union all select 2, date '2012-02-01', 'First for 2' from dual
    union all select 2, date '2012-02-03', 'Second for 2' from dual
    union all select 3, date '2012-02-01', 'First for 3' from dual
    union all select 3, date '2012-02-03', 'Second for 3' from dual
    union all select 3, date '2012-02-05', 'Third for 3' from dual
    union all select 3, date '2012-02-09', 'Fourth for 3' from dual
)
select id, created_date, value from (
    select a.id, b.created_date, b.value,
        row_number() over (partition by a.id order by b.created_date desc) as rn
    from a
    join b on b.a_id = a.id
)
where rn = 1
order by id;

        ID CREATED_D VALUE
---------- --------- ------------
         1 03-JAN-12 Third for 1
         2 03-FEB-12 Second for 2
         3 09-FEB-12 Fourth for 3

您可以从AB中选择所需的任何列,但如果两个表中都有相同的名称,则需要在子查询中对它们进行别名。

如果您的子记录具有相同的创建日期,则可能还需要使用rank()dense_rank()代替row_number来正确处理关系。