【问题标题】: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 列和一个时间戳

标签: sql sql-server tsql sql-server-2008 greatest-n-per-group


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多