如何从表中获取executionid仅关联running状态的运行中数据行
需求实现方案
以下三种实现方案可适配不同场景和数据库版本:
方案1:NOT EXISTS写法(全数据库兼容)
兼容性最强,所有关系型数据库都支持,性能也较为优秀:
SELECT * FROM 你的表名 t1 WHERE t1.status = 'running' AND NOT EXISTS ( SELECT 1 FROM 你的表名 t2 WHERE t2.executionid = t1.executionid AND t2.status = 'completed' )
逻辑说明:外层先筛选所有状态为running的记录,再通过NOT EXISTS排除同executionid下存在completed状态的记录,完全匹配需求。
方案2:分组筛选后关联(适合批量统计场景)
如果需要同时统计合法executionid的其他汇总信息,可以用该写法:
SELECT t.* FROM 你的表名 t INNER JOIN ( SELECT executionid FROM 你的表名 GROUP BY executionid HAVING SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) = 0 AND SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) >= 1 ) valid_ids ON t.executionid = valid_ids.executionid WHERE t.status = 'running'
方案3:窗口函数写法(适配MySQL8.0+、PostgreSQL、Oracle等支持窗口函数的数据库)
写法更简洁,多条件扩展更方便:
WITH t_with_flag AS ( SELECT *, COUNT(CASE WHEN status = 'completed' THEN 1 END) OVER(PARTITION BY executionid) AS completed_cnt FROM 你的表名 ) SELECT * FROM t_with_flag WHERE status = 'running' AND completed_cnt = 0
内容的提问来源于stack exchange,提问作者Debasish Halder
相关产品推荐
相关产品推荐

