Warm tip: This article is reproduced from serverfault.com, please click

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

(sql - Only select the first row from another joined table)

发布于 2020-12-01 19:38:35

我有两个表:

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,因为该表中有两条消息。我只想选择第一条消息。我尝试添加前1名,但这无济于事。我真的是SQL新手。

Questioner
jsmos
Viewed
11
GMB 2020-12-02 05:08:01

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