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

如何在PL/SQL中为查询结果集迭代添加行?含work_order表具体需求

PL/SQL实现工单与任务组合行生成

可以通过分层查询(CONNECT BY)或者预生成数字序列表的方式实现需求,以下是两种常用方案:

方案一:使用CONNECT BY生成序列并交叉关联

这种方式无需额外创建表,直接通过Oracle分层语法生成所需的Task_no和Task_step_no序列,再与work_order表做全量组合:

SELECT 
    wo.wo_no,
    task_seq.task_no,
    step_seq.task_step_no
FROM 
    work_order wo
CROSS JOIN (
    -- 生成1到5的Task_no序列
    SELECT LEVEL AS task_no
    FROM DUAL
    CONNECT BY LEVEL <=5
) task_seq
CROSS JOIN (
    -- 生成1到2000的Task_step_no序列
    SELECT LEVEL AS task_step_no
    FROM DUAL
    CONNECT BY LEVEL <=2000
) step_seq;

说明

  • CROSS JOIN会将工单表的每一行与Task_no、Task_step_no序列做全量匹配,确保每个wo_no都覆盖所有1-5的Task_no和1-2000的Task_step_no。
  • 若work_order表数据量大,会生成海量结果(比如100个工单对应10052000=100万行),需注意性能开销。

方案二:使用预定义数字表关联(适合频繁使用场景)

如果需要多次执行这类查询,可预先创建数字序列表,后续直接关联复用:

  1. 创建并初始化数字表(仅需执行一次):
CREATE TABLE num_seq (n NUMBER PRIMARY KEY);
-- 插入1到2000的连续数字
INSERT INTO num_seq(n)
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=2000;
COMMIT;
  1. 执行组合查询:
SELECT 
    wo.wo_no,
    task_n.n AS task_no,
    step_n.n AS task_step_no
FROM 
    work_order wo
CROSS JOIN num_seq task_n
CROSS JOIN num_seq step_n
WHERE 
    task_n.n BETWEEN 1 AND 5
    AND step_n.n BETWEEN 1 AND 2000;

说明

  • 预创建数字表可避免每次查询都重新生成序列,提升重复查询的效率,且该表可复用在其他需要连续数字的场景中。

注意事项

  • 若work_order表数据量较大,建议添加过滤条件(如WHERE wo.wo_no IN (...))缩小结果集规模,避免性能问题。
  • 可将查询逻辑封装为存储过程或函数,方便后续调用。

内容的提问来源于stack exchange,提问作者user2153047

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:40:25