sql - 将多个表中的最新引用合并到共享行中的查询
问题描述
我有以下非常简单直接的架构:
我想编写一个优化查询,返回所有手机的列表,其中包含最新消息和拍摄的最新照片。在这种情况下,两个字段都有最新的“CreatedAt”:
预期数据集示例:
-------------------------------------------
| Phone Id | Message Id | Picture Id |
-------------------------------------------
| 1 | 3 | 4 |
| 2 | 4 | 5 |
| 3 | 5 | 6 |
-------------------------------------------
现在我不确定如何编写这样的查询,所以我只是抓取所有内容,然后使用服务器端代码以编程方式将其过滤掉,即:
SELECT * FROM Phones
LEFT OUTER JOIN Messages ON Messages.PhoneId = Phones.Id
LEFT OUTER JOIN Photos ON Photos.PhoneId = Phones.Id
--and then code that filters the CreatedAt in another language
如何编写以下查询?
解决方案
OUTER APPLY
在这里似乎很有用:
SELECT p.*, m.*, ph.*
FROM Phones p OUTER APPLY
(SELECT TOP (1) m.*
FROM Messages m
WHERE m.PhoneId = p.Id
ORDER BY m.CreatedAt DESC
) m OUTER APPLY
(SELECT TOP (1) ph.*
FROM Photos ph
WHERE ph.PhoneId = p.Id
ORDER BY ph.CreatedAt DESC
) ph;
推荐阅读
- gpu - 如何知道机器使用的是哪个 GPU?
- ruby-on-rails - Rails action_dispatch cookie 和 flash_hash 可能不一致
- uiimageview - iOS 14.5 为什么 UIImageView 拒绝渲染从 CIImage 创建的 UIImage?
- python - 在单行中汇总多个值
- assembly - MIPS jal 不记得位置
- angular - “数字”类型的参数不能分配给自定义请求类型的参数
- c++ - 在 C++ 中通过引用返回对象
- python - jupyter notebook 中的延迟/延迟功能
- php - 如何检查字符串的第一个单词是否在 PHP 中?
- java - 如何使用 Spring MockMvc 上传文件并使用内容类型表单数据传递更多参数?