我有一个要求,我需要在子记录中获取最新创建的数据。
假设有两个表A和B. A是父,B是子。他们有1:M的关系。两者都有一些列,B表有一个'创建日期'列,它也保存表B中记录的创建日期。
现在,我需要编写一个查询,它可以从A表中获取所有记录,并从B表中获取最新创建的子记录。假设如果今天在表B中为父记录创建了两个子记录,则应该获取最新的一个记录。
A表的一个记录可能有很多孩子,所以我们怎样才能实现这个目标。
结果应为 - tbl A列,tbl B列(最新创建的一列)
答案 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
此处我们有两个表A
和B
,根据主键加入它们,按照降序排列表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为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
中选择所需的任何列,但如果两个表中都有相同的名称,则需要在子查询中对它们进行别名。
如果您的子记录具有相同的创建日期,则可能还需要使用rank()
或dense_rank()
代替row_number
来正确处理关系。