如何修改SQL实现子查询遍历support表所有pmi值筛选符合要求的结果
方案1:窗口函数实现(推荐,兼容所有支持窗口函数的主流数据库)
该方案逻辑清晰,执行效率更高,适配MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数新版本数据库:
SELECT pmi FROM ( SELECT pmi, reason, ROW_NUMBER() OVER (PARTITION BY pmi ORDER BY datereceived DESC) AS rn FROM support ) t WHERE rn = 1 AND reason = 'XYZ';
逻辑说明:用ROW_NUMBER()窗口函数按pmi分组,每组内按datereceived倒序排序,每组排序为1的记录就是对应pmi的最新数据,直接筛选最新数据中reason为XYZ的记录即可得到目标pmi值。
方案2:沿用原有逻辑的关联子查询实现
如果你希望和原写法逻辑保持一致,或使用的数据库不支持窗口函数,可以修改为关联子查询:
SELECT DISTINCT pmi FROM support s WHERE supportid = ( SELECT supportid FROM support WHERE pmi = s.pmi ORDER BY datereceived DESC FETCH FIRST 1 ROW ONLY ) AND reason ='XYZ';
逻辑说明:把原写法中子查询硬编码的pmi = '123'替换为和外层表的pmi关联,即可遍历表中所有pmi逐个匹配最新记录,加DISTINCT避免符合条件的pmi重复返回。如果你的数据库不支持FETCH FIRST 1 ROW ONLY语法,可以替换为对应数据库的分页写法,比如MySQL用LIMIT 1、SQL Server用TOP 1。
内容的提问来源于stack exchange,提问作者Kkunnuthara
相关产品推荐
相关产品推荐

