Oracle查询关联表c获取各book最大version对应记录的实现方法
需求说明
你已完成基于表a、表b的多表筛选聚合查询,原始SQL逻辑可正确返回符合筛选条件的各book对应最大version值,原始SQL如下:
select book, max(version) from a,b where condition 1, condition 2... and so on
该查询返回的结果示例:
- book1 对应 version=3
- book2 对应 version=2
- book3 对应 version=1
现需要将上述结果与表c关联:表c包含book、version、id三个字段,同一book存在多条不同version的记录(例如book1在c表中存在version=1到4共4条记录),关联规则为仅匹配每个book与前序查询返回的对应version完全一致的行,过滤其余不匹配记录,最终获取对应行的id等字段。
实现方案
核心思路是将已验证正确的聚合查询作为独立结果集,通过book+version两个关联字段和表c做内连接即可,提供两种兼容不同数据库版本的写法:
写法1:CTE写法(可读性高,适配MySQL8.0+、PostgreSQL、SQL Server等所有支持CTE语法的数据库)
WITH book_valid_max_ver AS ( SELECT book, max(version) AS max_ver FROM a,b WHERE condition 1, condition 2... and so on ) SELECT c.* FROM c INNER JOIN book_valid_max_ver m ON c.book = m.book AND c.version = m.max_ver;
写法2:子查询写法(兼容老旧数据库版本,如MySQL5.x)
SELECT c.* FROM c INNER JOIN ( SELECT book, max(version) AS max_ver FROM a,b WHERE condition 1, condition 2... and so on ) m ON c.book = m.book AND c.version = m.max_ver;
避坑提示:不要跳过子查询/CTE封装,直接在关联c表时写max聚合逻辑,否则会丢失a、b表上配置的筛选条件,误匹配到c表中不符合规则的高version记录(例如示例中book1在c表存在version=4的记录,但前序查询返回的合法最大version是3,直接裸写聚合就会错误匹配到version=4的无效行)。
内容的提问来源于stack exchange,提问作者thierry baraton
相关产品推荐
相关产品推荐

