仅从另一个联接表中选择第一行

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 模式

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据

HIVE:如何仅从两个表中的两列中选择第三个表中不存在的不同值?

如何使用第一个表中的逗号分隔值从另一个表中选择行? [复制]