Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
SQl查询:需要在子记录中获取最新创建的数据_Sql_Oracle - Fatal编程技术网

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

SQl查询:需要在子记录中获取最新创建的数据,sql,oracle,Sql,Oracle,我有一个要求,我需要在子记录中获取最新创建的数据 假设有两个表A和B。A是父表,B是子表。他们有1:M的关系。两者都有一些列,B表也有一个“创建日期”列,该列保存表B中记录的创建日期 现在,我需要编写一个查询,它可以从一个表中获取所有记录,并从B表中获取最新创建的子记录。假设今天在表B中为一个父记录创建了两个子记录,那么其中最新的一个应该得到fetch 一张桌子的一条记录可能有很多孩子,那么我们如何才能做到这一点呢 结果应该是-tbl A的列,tbl BLAST的列创建了一个下面是可以帮助您的查

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

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

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

一张桌子的一条记录可能有很多孩子,那么我们如何才能做到这一点呢


结果应该是-tbl A的列,tbl BLAST的列创建了一个

下面是可以帮助您的查询

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
这里我们有两个表A和表B,它们基于主键连接在一起,在表B的created date列中按降序排列


使用此输出作为外部查询的内联视图,并选择所需的列,如x、y。其中rownum<2将获取表B的最新记录,我希望“created date”是一个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]

这不是最有效的,但仅适用于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)
您可以使用来避免多次击中每个表或特别是B

使用CTE为A和B提供虚拟数据,您可以执行以下操作:

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
您可以从A和B中选择所需的任何列,但如果两个表中都有同名的列,则需要在子查询中对它们进行别名


如果您可以拥有具有相同创建日期的子记录,则您可能还需要用户排名或密集排名,而不是行编号来适当处理关系。

您是否可以提供。。一些数据样本和表结构?它更好更快。。每个人都可以查看和帮助。嗨,基思,非常感谢你的回复。然而,我不想让你在这里质疑。比如“A.ParentID=B.ParentID”。我猜你想要“A.PK=B.FK”。您能让我理解这个查询是如何工作的吗?您是正确的,表A中的主键是表B中的外键。子查询查找每个PK的最新记录