sql - 仅从另一个联接表中选择第一行
问题描述
我有两张桌子:
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 真的很陌生。
解决方案
您似乎想要每个实验室的最新消息。一种选择使用横向连接。假设该表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
推荐阅读
- vba - 启动 VBA 应用程序块使用和打开其他工作簿
- leaflet - 更改传单绘制中的顶点样式
- mongodb - mongodb异常连接失败
- android - Cannot find the declaration of element 'android.support.constraint.ConstraintLayout'
- javascript - pouchdb 对花式树的承诺
- git - Maintaining two git branches with a fixed set of differences
- typescript - Typescript - Application wide state (Singleton?)
- javascript - 使用 fetch 或 axios 发送身份验证标头
- arrays - 在 Ansible 中过滤变量数组
- android - 数据绑定在运行时更改按钮颜色