仅从另一个联接表中选择第一行
Posted
技术标签:
【中文标题】仅从另一个联接表中选择第一行【英文标题】:Only select the first row from another joined table 【发布时间】:2021-03-13 18:43:10 【问题描述】:我有两张桌子:
Labs
==========
LabID
==========
1
Messages
==========
Message
==========
Hello world
Hello world 2
我想加入这两个表,所以输出变成:
=== Lab ID === Messages ===
1 Hello World
如果我这样做
select * from Labs l inner join Messages m on l.LabID = m.LabID
它会两次打印第一个 ID,因为该表中有两条消息。我只想选择第一条消息。 我尝试添加 top 1 但这没有任何作用。我真的是 SQL 新手。
【问题讨论】:
您需要一些方法来区分第二个表中的 2 行,并只选择其中的一个吗? 是的,我可以试试 您确定要向我们展示这些表格的全部内容吗? 您必须将 LabID 作为 Messages 中的一列,您还有哪些其他列,是否有可以获取最新或最早消息的日期/时间列? 是的,消息中有一个 labid 列和一个时间戳 【参考方案1】:您似乎想要每个实验室的最新消息。一种选择使用横向连接。假设表 messages
有一个名为 labid
的外键列引用 labs
,还有一个名为 id
的列可用于对行进行排序,您可以将其表述为:
select l.*, m.mesage
from labs l
cross apply (
select top (1) * from messages m where m.labid = l.labid order by m.id desc
) m
如果您想允许没有消息的实验室,请改用outer apply
。
另一个选项是row_number()
:
select l.*, m.mesage
from labs l
inner join (
select m.*, row_number() over(partition by labid order by id desc) rn
from messages m
) m on m.labid = l.labid and m.rn = 1
【讨论】:
以上是关于仅从另一个联接表中选择第一行的主要内容,如果未能解决你的问题,请参考以下文章
如何仅从 PostgreSQL 的内部联接中不存在 id 的表中选择行?
仅从 Spring Data JPA 中的联接表(多对多)中选择特定列
SQL INNER JOIN - 根据另一行的值从另一个表中选择数据