简体   繁体   中英

How can I add rows iteratively to a select result set in pl sql?

In the work_order table there is wo_no. When I query the work_order table I want 2 additional columns (Task_no, Task_step_no) in the results set as follows

this should be iterate for all the wo_no s in the work_order table. task_no should go up to 5 and task_step_no should go upto 2000. (please have a look on the attached image to see the results set if not clear)

Any idea how to get such a results set in plsql?

One option is to use 2 row generators cross joined to your current table.

SQL> with
  2  work_order (wo_no) as
  3    (select 1 from dual union all
  4     select 2 from dual
  5    ),
  6  task (task_no) as
  7    (select level from dual connect by level <= 5),
  8  step (task_step_no) as
  9    (select level from dual connect by level <= 20)    --> you'd have 2000 here
 10  select y.wo_no, t.task_no, s.task_step_no
 11  from work_order y cross join task t cross join step s
 12  order by 1, 2, 3;

Result:

     WO_NO    TASK_NO TASK_STEP_NO
---------- ---------- ------------
         1          1            1
         1          1            2
         1          1            3
         1          1            4
         1          1            5
         1          1            6
         1          1            7
         1          1            8
         1          1            9
         1          1           10
         1          1           11
         1          1           12
         1          1           13
         1          1           14
         1          1           15
         1          1           16
         1          1           17
         1          1           18
         1          1           19
         1          1           20
         1          2            1
         1          2            2
         1          2            3
         1          2            4
         1          2            5
         1          2            6
         1          2            7
         1          2            8
         1          2            9
         1          2           10
         1          2           11
         1          2           12
         1          2           13
         1          2           14
         1          2           15
         1          2           16
         1          2           17
         1          2           18
         1          2           19
         1          2           20
         1          3            1
         1          3            2
         1          3            3
         1          3            4
         1          3            5
         1          3            6
         1          3            7
         1          3            8
         1          3            9
         1          3           10
         1          3           11
         1          3           12
         1          3           13
         1          3           14
         1          3           15
         1          3           16
         1          3           17
         1          3           18
         1          3           19
         1          3           20
         1          4            1
         1          4            2
         1          4            3
         1          4            4
         1          4            5
         1          4            6
         1          4            7
         1          4            8
         1          4            9
         1          4           10
         1          4           11
         1          4           12
         1          4           13
         1          4           14
         1          4           15
         1          4           16
         1          4           17
         1          4           18
         1          4           19
         1          4           20
         1          5            1
         1          5            2
         1          5            3
         1          5            4
         1          5            5
         1          5            6
         1          5            7
         1          5            8
         1          5            9
         1          5           10
         1          5           11
         1          5           12
         1          5           13
         1          5           14
         1          5           15
         1          5           16
         1          5           17
         1          5           18
         1          5           19
         1          5           20
         2          1            1
         2          1            2
         2          1            3
         2          1            4
         2          1            5
         2          1            6
         2          1            7
         2          1            8
         2          1            9
         2          1           10
         2          1           11
         2          1           12
         2          1           13
         2          1           14
         2          1           15
         2          1           16
         2          1           17
         2          1           18
         2          1           19
         2          1           20
         2          2            1
         2          2            2
         2          2            3
         2          2            4
         2          2            5
         2          2            6
         2          2            7
         2          2            8
         2          2            9
         2          2           10
         2          2           11
         2          2           12
         2          2           13
         2          2           14
         2          2           15
         2          2           16
         2          2           17
         2          2           18
         2          2           19
         2          2           20
         2          3            1
         2          3            2
         2          3            3
         2          3            4
         2          3            5
         2          3            6
         2          3            7
         2          3            8
         2          3            9
         2          3           10
         2          3           11
         2          3           12
         2          3           13
         2          3           14
         2          3           15
         2          3           16
         2          3           17
         2          3           18
         2          3           19
         2          3           20
         2          4            1
         2          4            2
         2          4            3
         2          4            4
         2          4            5
         2          4            6
         2          4            7
         2          4            8
         2          4            9
         2          4           10
         2          4           11
         2          4           12
         2          4           13
         2          4           14
         2          4           15
         2          4           16
         2          4           17
         2          4           18
         2          4           19
         2          4           20
         2          5            1
         2          5            2
         2          5            3
         2          5            4
         2          5            5
         2          5            6
         2          5            7
         2          5            8
         2          5            9
         2          5           10
         2          5           11
         2          5           12
         2          5           13
         2          5           14
         2          5           15
         2          5           16
         2          5           17
         2          5           18
         2          5           19
         2          5           20

200 rows selected.

SQL>

As you already have the work_order table, you'd just use it in FROM clause (not as a CTE):

with
task (task_no) as
  (select level from dual connect by level <= 5),
step (task_step_no) as
  (select level from dual connect by level <= 20)
select y.wo_no, t.task_no, s.task_step_no
from work_order y cross join task t cross join step s
order by 1, 2, 3;  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM