SQL:从最近的 child table 条目中选择列
SQL: Selecting columns from most recent child table entry
我目前正在尝试找到一种方法来检索 table 中的所有记录及其最近关联的 child 记录。简化的 table 结构如下所示:
Parents Children
______ ________
Id Id
Age ParentId
FirstName
LastName
DateCreated
我希望所有 parents 的名字和姓氏都是他们最近创建的 child(按 DateCreated
排序)。这些 table 在实践中非常大,我希望通过选择所有 parents 及其所有关联的 children 获得一些性能,这是我目前通过以下查询所拥有的:
select * from parents p join children c on p.id = c.parentid
然后在内存中使用应用程序代码找到所需的结果。
感谢所有帮助。
您可以使用子查询进行过滤:
select p.*, c.firstname, c.lastname
from parents p
inner join children c on c.parentid = p.id
where c.datecreated = (
select max(c1.datecreated)
from children c1
where c1.parentid = c.parentid
) c
另一种选择是横向连接:
select p.*, c.firstname, c.lastname
from parents p
cross apply (
select top (1) c.*
from children c
where c.parentid = p.id
order by c.datecreated desc
)
如果我没理解错的话,你可以使用横向连接(即apply
):
select p.*, c.*
from parents p cross apply
(select top (1) c.*
from children c
where p.id = c.parentid
order by c.datecreated desc
) c;
为了获得最佳性能,您需要在 children(parentid, datecreated desc)
上建立索引。
我目前正在尝试找到一种方法来检索 table 中的所有记录及其最近关联的 child 记录。简化的 table 结构如下所示:
Parents Children
______ ________
Id Id
Age ParentId
FirstName
LastName
DateCreated
我希望所有 parents 的名字和姓氏都是他们最近创建的 child(按 DateCreated
排序)。这些 table 在实践中非常大,我希望通过选择所有 parents 及其所有关联的 children 获得一些性能,这是我目前通过以下查询所拥有的:
select * from parents p join children c on p.id = c.parentid
然后在内存中使用应用程序代码找到所需的结果。
感谢所有帮助。
您可以使用子查询进行过滤:
select p.*, c.firstname, c.lastname
from parents p
inner join children c on c.parentid = p.id
where c.datecreated = (
select max(c1.datecreated)
from children c1
where c1.parentid = c.parentid
) c
另一种选择是横向连接:
select p.*, c.firstname, c.lastname
from parents p
cross apply (
select top (1) c.*
from children c
where c.parentid = p.id
order by c.datecreated desc
)
如果我没理解错的话,你可以使用横向连接(即apply
):
select p.*, c.*
from parents p cross apply
(select top (1) c.*
from children c
where p.id = c.parentid
order by c.datecreated desc
) c;
为了获得最佳性能,您需要在 children(parentid, datecreated desc)
上建立索引。