首页 > 解决方案 > 仅从另一个联接表中选择第一行

问题描述

我有两张桌子:

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 真的很陌生。

标签: sqlsql-servertsqlsql-server-2008greatest-n-per-group

解决方案


您似乎想要每个实验室的最新消息。一种选择使用横向连接。假设该表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

推荐阅读