如何用SQL查询指定步骤为工作流最后进阶步骤的记录
用关联SQL实现指定步骤为对象最后进阶步骤的查询
表结构与数据
WORKFLOW表
| ID_WORKFLOW | ID_STEP | ID_OBJECT |
|---|---|---|
| 100 | 1 | BUSNIESS_OBJECT_1 |
| 101 | 2 | BUSNIESS_OBJECT_1 |
| 102 | 3 | BUSNIESS_OBJECT_1 |
| 103 | 4 | BUSNIESS_OBJECT_1 |
| 104 | 5 | BUSNIESS_OBJECT_1 |
| 105 | 1 | BUSNIESS_OBJECT_2 |
| 106 | 2 | BUSNIESS_OBJECT_2 |
| 107 | 3 | BUSNIESS_OBJECT_2 |
STEP表
| ID_STEP | CODE | LEVEL |
|---|---|---|
| 1 | STEP_1 | 10 |
| 2 | STEP_2 | 20 |
| 3 | STEP_3 | 30 |
| 4 | STEP_4 | 40 |
| 5 | STEP_5 | 50 |
查询需求
查询WORKFLOW表中满足以下两个条件的记录:
- 关联的STEP表中
CODE为指定值(例如STEP_3); - 该步骤是对应
ID_OBJECT的最后进阶步骤(即该对象关联的所有STEP中LEVEL值最大)。
示例:当筛选STEP.CODE='STEP_3'时,仅返回ID_WORKFLOW=107——因为BUSNIESS_OBJECT_1存在LEVEL更高的步骤(40、50均大于30),所以ID_WORKFLOW=102不符合要求。
实现方案:无需游标,用关联SQL即可完成
完全不需要使用游标,通过关联子查询或窗口函数就能实现需求,以下是两种常见写法:
写法1:关联子查询
SELECT w.* FROM WORKFLOW w JOIN STEP s ON w.ID_STEP = s.ID_STEP WHERE s.CODE = 'STEP_3' -- 替换为目标CODE值 AND s.LEVEL = ( SELECT MAX(s2.LEVEL) FROM WORKFLOW w2 JOIN STEP s2 ON w2.ID_STEP = s2.ID_STEP WHERE w2.ID_OBJECT = w.ID_OBJECT );
写法2:窗口函数(大数据量场景更高效)
WITH ObjectMaxStep AS ( SELECT w.ID_WORKFLOW, w.ID_OBJECT, s.CODE, s.LEVEL, MAX(s.LEVEL) OVER (PARTITION BY w.ID_OBJECT) AS MaxLevel FROM WORKFLOW w JOIN STEP s ON w.ID_STEP = s.ID_STEP ) SELECT ID_WORKFLOW, ID_OBJECT FROM ObjectMaxStep WHERE CODE = 'STEP_3' -- 替换为目标CODE值 AND LEVEL = MaxLevel;
说明
- 两种写法均能精准筛选符合要求的记录,无需游标这类循环逻辑;
- 窗口函数写法在数据量较大时性能更优,仅需扫描表一次;
- 替换代码中的
'STEP_3'即可适配不同的查询目标。
内容的提问来源于stack exchange,提问作者OHA
相关产品推荐
相关产品推荐

