SQL如何查询每个应用最新版本的name、description等字段值
查询所有应用最新版本字段的SQL实现方案
你的表结构是典型的追加式版本控制设计,针对「获取每个应用对应最新版本的动态字段」需求,有以下几种可落地的写法,适配不同数据库环境:
- 通用兼容写法(支持所有关系型数据库)
基于你已经写出的最大版本查询语句做内连接即可,是兼容性最好的方案:
如果需要关联查询SELECT av.application_id, av.name, av.description, av.version FROM application_version av INNER JOIN ( SELECT application_id, MAX(version) AS max_version FROM application_version GROUP BY application_id ) AS latest_version ON av.application_id = latest_version.application_id AND av.version = latest_version.max_version;application表中存储的静态字段(比如创建时间),可以再关联主表:SELECT a.id AS application_id, a.created_at, av.name, av.description, av.version FROM application a INNER JOIN application_version av ON a.id = av.application_id INNER JOIN ( SELECT application_id, MAX(version) AS max_version FROM application_version GROUP BY application_id ) AS latest_version ON av.application_id = latest_version.application_id AND av.version = latest_version.max_version; - 窗口函数写法(支持MySQL 8.0+、PostgreSQL、SQL Server等主流新版本数据库)
性能更优,写法更简洁,适合数据量较大的场景:SELECT application_id, name, description, version FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY application_id ORDER BY version DESC ) AS row_rank FROM application_version ) t WHERE row_rank = 1;注意:如果存在同一个应用下version重复的异常数据,
ROW_NUMBER()会随机取其中一条返回;如果需要返回同版本下的所有记录,可以将ROW_NUMBER()替换为RANK()。 - PostgreSQL专属简洁写法
PostgreSQL支持DISTINCT ON语法,可以用更短的语句实现同等效果:SELECT DISTINCT ON (application_id) application_id, name, description, version FROM application_version ORDER BY application_id, version DESC;
避坑提示:不要直接在GROUP BY application_id的语句中直接查询name、description字段,绝大多数数据库会直接抛出语法错误,少数开启非严格模式的数据库会返回随机匹配的字段值,导致数据和最新版本不对应。
内容的提问来源于stack exchange,提问作者InspectorGadget
相关产品推荐
相关产品推荐

