如何从Academic表按优先级条件获取单条符合要求的记录?
解决Academic表的优先级查询问题
针对你的需求——优先获取status为'A'或'W'的记录,无匹配时取'T'且仅返回一条,提供几种实用的SQL写法:
方法1:排序后取第一条(单id查询)
通过CASE给记录标记优先级,排序后限制返回第一条:
SELECT id, status, EffDate FROM Academic WHERE id = 1 -- 替换为你要查询的目标id ORDER BY -- 给优先条件的记录分配更高优先级(排序值越小越靠前) CASE WHEN status IN ('A', 'W') THEN 1 ELSE 2 END, EffDate DESC -- 可选:同优先级时取最新生效日期 LIMIT 1;
如果同id下有多个符合优先条件的记录,EffDate DESC会帮你筛选出最新的那条,可根据实际需求调整排序规则。
方法2:UNION ALL组合查询(单id查询)
先查询优先条件的记录,无结果时再查询'T'的记录:
-- 先查优先匹配的记录 SELECT id, status, EffDate FROM Academic WHERE id = 1 AND status IN ('A', 'W') LIMIT 1 UNION ALL -- 优先条件无结果时,查'T'的记录 SELECT id, status, EffDate FROM Academic WHERE id = 1 AND status = 'T' LIMIT 1 -- 外层LIMIT确保最终只返回一条 LIMIT 1;
方法3:窗口函数(批量处理所有id)
如果需要为每个id都返回一条符合条件的记录,用ROW_NUMBER()窗口函数分组排序:
WITH ranked_records AS ( SELECT id, status, EffDate, ROW_NUMBER() OVER ( PARTITION BY id ORDER BY CASE WHEN status IN ('A', 'W') THEN 1 ELSE 2 END, EffDate DESC ) AS row_rank FROM Academic ) SELECT id, status, EffDate FROM ranked_records WHERE row_rank = 1;
这个写法会按id分组,每组内按优先级排序后取第一条,适合批量处理全表数据。
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

