sql - SQL Server - 如何从多个表中获取每个组的最新更新
问题描述
例如,我有 3 个表:
tbl_main
-------------------------
|ID_No |Info1 |Info2 |
|------+--------+-------|
|00123 |name1 |a city |
|00567 |name2 |b city |
|00789 |name3 |c city |
-------------------------
tbl_version
--------------------------------
|ID_No |Version_Name|Version_No|
|------+------------+----------|
|00123 |version_a_01|1 |
|00567 |version_b_01|1 |
|00789 |version_c_01|1 |
--------------------------------
tbl_version_upd
--------------------------------
|ID_No |Version_Name|Version_No|
|------+------------+----------|
|00123 |version_a_02|2 |
|00123 |version_a_03|2 |
|00123 |version_a_04|4 |
|00789 |version_c_02|2 |
--------------------------------
我想根据来自 tbl_version 和 tbl_version_upd 的 Version_No 获取每个 ID_No 的最新 Version_Name 。
Wanted output:
--------------------------------------
|ID_No |Info1 |Info2 |Version_Name|
|------+--------+-------+------------|
|00123 |name1 |a city |version_a_04|
|00567 |name2 |b city |version_b_01|
|00789 |name3 |c city |version_c_02|
--------------------------------------
目前,我有这个查询:
Select a.ID_No, a.Info1, a.Info2, b.Version_Name
FROM tbl_main a
LEFT JOIN (tbl_version UNION ALL tbl_version_upd) b ON a.ID_No=b.ID_No
但它会获取每个 ID_No 的所有版本
Current output:
--------------------------------------
|ID_No |Info1 |Info2 |Version_Name|
|------+--------+-------+------------|
|00123 |name1 |a city |version_a_01|
|00123 |name1 |a city |version_a_02|
|00123 |name1 |a city |version_a_03|
|00123 |name1 |a city |version_a_04|
|00567 |name2 |b city |version_b_01|
|00789 |name3 |c city |version_c_01|
|00789 |name3 |c city |version_c_02|
--------------------------------------
解决方案
应用是获得它的好方法,我还为联合使用了 CTE,但只是为了便于阅读,子查询也可以
;WITH allversions AS (
SELECT ID_No, Version_Name, Version_No
FROM tbl_version
UNION ALL
SELECT ID_No, Version_Name, Version_No
FROM tbl_version_upd
)
SELECT a.ID_No, a.Info1, a.Info2, b.Version_Name
FROM tbl_main a
OUTER APPLY (
SELECT TOP 1 Version_Name
FROM allversions av
WHERE av.ID_No = a.ID_No
ORDER BY Version_No DESC
) b
推荐阅读
- firebase - 禁用 auth/user-not-found 功能
- flutter - 未来类型递归函数无法正常工作
- express - 在快速边缘迭代数字类型?
- java - 我想使用 java 实现 websocket,但 StompHeaderAccessor 引用的 getSessionAttributes() 函数显示错误
- steam - 以欧元获取 Steam 市场 (API) 结果
- verilog - 32 位加法减法器模型编译错误:Illegal Lvalue
- google-cloud-storage - Firebase 存储公共 URL 访问被拒绝(我需要一个具有公共访问权限的永久 URL) makePublic()
- oop - 为什么这个 oops 概念代码不起作用?
- php - Apache 正在下载 php 文件而不是执行它们
- openapi - 如何区分 OpenAPI 模式中的多个属性?