基于Workorder而非WorkorderOccurrence的SQL Server分页查询问题
解决SQL Server按Workorder分页返回所有关联实例的方法
核心思路是先分页筛选出指定数量的Workorder,再关联获取这些工单对应的全部WorkorderOccurrence及Schedule数据,替代直接对实例表分页的逻辑。
步骤1:分页获取目标Workorder集合
先单独对Workorder表做分页,拿到当前页需要的工单唯一标识(比如WorkorderID),用CTE+临时表存储结果:
-- 示例:每页10条工单,查询第2页 WITH PagedWorkorders AS ( SELECT WorkorderID, ROW_NUMBER() OVER (ORDER BY CreateTime DESC) AS RowNum -- 替换为你的排序字段 FROM Workorder WHERE -- 按需添加工单筛选条件,比如状态、所属部门等 Status = 'Active' ) SELECT WorkorderID INTO #TempWorkorders FROM PagedWorkorders WHERE RowNum BETWEEN ((2-1)*10 + 1) AND (2*10); -- 替换页码(@PageNum)和每页数量(@PageSize)
如果数据量较大,给临时表加索引提升后续关联性能:
CREATE CLUSTERED INDEX IX_TempWorkorders_WorkorderID ON #TempWorkorders(WorkorderID);
步骤2:关联查询所有对应实例及关联表数据
用临时表中的WorkorderID关联WorkorderOccurrence和Schedule,获取该页工单的全部实例数据:
SELECT w.WorkorderID, w.Title, -- 替换为Workorder的实际字段 w.Description, wo.OccurrenceID, wo.OccurrenceStartTime, -- 替换为WorkorderOccurrence的实际字段 wo.OccurrenceEndTime, s.ScheduleName, -- 替换为Schedule的实际字段 s.ScheduleType FROM #TempWorkorders tw JOIN Workorder w ON tw.WorkorderID = w.WorkorderID JOIN WorkorderOccurrence wo ON w.WorkorderID = wo.WorkorderID LEFT JOIN Schedule s ON wo.ScheduleID = s.ScheduleID -- 根据实际表关联关系调整 ORDER BY w.WorkorderID, wo.OccurrenceStartTime; -- 按需排序
关键说明
- 禁止直接对WorkorderOccurrence使用
OFFSET ... FETCH NEXT ...:这种方式会按实例数量分页,导致同一工单的实例被拆分到不同页,或者一页包含多个工单的零散实例,完全不符合前端按工单分页的需求。 - 排序字段优化:Workorder的排序字段(如CreateTime)建议创建索引,避免分页时全表扫描,大幅提升性能。
内容的提问来源于stack exchange,提问作者Adrien Ruffie
相关产品推荐
相关产品推荐

