You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:01:10