关联三表查询非completed状态的最新productorder记录及SQL修正
按productorder获取最新非completed记录的正确SQL实现
原SQL返回结果过多的核心问题:
- 子查询缺少
GROUP BY productorder,MAX(date)无法按分组正确计算最大日期 - 子查询仅拿到productorder和最大日期,但未关联回原
date表锁定对应记录,直接关联product、info表时,一个productorder对应多个productID会导致结果重复膨胀 - 未通过日期字段关联子查询与原
date表,无法精准定位每个分组的最新记录
方法一:窗口函数实现(逻辑清晰,推荐)
SELECT d.productorder, d.status, i.info FROM ( SELECT productorder, status, date, -- 按productorder分组,日期倒序给记录编号,最新记录排第1 ROW_NUMBER() OVER (PARTITION BY productorder ORDER BY date DESC) AS rn FROM date WHERE status <> 'completed' ) d INNER JOIN product p ON d.productorder = p.productorder INNER JOIN info i ON p.productID = i.productID WHERE d.rn = 1; -- 只保留每个分组的最新记录
方法二:关联子查询实现(兼容不支持窗口函数的数据库)
SELECT d.productorder, d.status, i.info FROM date d INNER JOIN product p ON d.productorder = p.productorder INNER JOIN info i ON p.productID = i.productID WHERE d.status <> 'completed' -- 匹配同productorder下的最大非completed日期 AND d.date = ( SELECT MAX(date) FROM date WHERE productorder = d.productorder AND status <> 'completed' );
两种方法都会先锁定每个productorder的最新非completed记录,再关联product和info表,从根源避免重复结果。
内容的提问来源于stack exchange,提问作者Birgitta
相关产品推荐
相关产品推荐

