First we need a complete list of tasks from both columns with hierarchical links:
select all_jobs.job_id as jobstream, job_depends.follow_jobstream as parent_jobstream from ( select jobstream job_id from job_list union select follow_jobstream job_id from job_list ) all_jobs, job_list job_depends where job_depends.jobstream (+) = all_jobs.job_id
Then determine the depth of each job.
with full_job_list as ( select all_jobs.job_id as jobstream, job_depends.follow_jobstream as parent_jobstream from ( select jobstream job_id from job_list union select follow_jobstream job_id from job_list ) all_jobs, job_list job_depends where job_depends.jobstream (+) = all_jobs.job_id ) select CONNECT_BY_ROOT jobstream as jobstream, level as lvl, CONNECT_BY_ROOT parent_jobstream as preceding_jobstream, sys_connect_by_path(jobstream, '<-') as path_illustration from full_job_list connect by prior parent_jobstream = jobstream
And finally, sort tasks by depth. Work at the same depth can work in any order.
with full_job_list as ( select all_jobs.job_id as jobstream, job_depends.follow_jobstream as parent_jobstream from ( select jobstream job_id from job_list union select follow_jobstream job_id from job_list ) all_jobs, job_list job_depends where job_depends.jobstream (+) = all_jobs.job_id ) select jobstream, depth, preceding_jobstream from ( select distinct jobstream, ( last_value(lvl ignore nulls) over ( partition by jobstream order by lvl rows between unbounded preceding and unbounded following ) ) as depth, ( last_value(preceding_jobstream ignore nulls) over ( partition by jobstream order by lvl rows between unbounded preceding and unbounded following ) ) as preceding_jobstream from ( select CONNECT_BY_ROOT jobstream as jobstream, level as lvl, CONNECT_BY_ROOT parent_jobstream as preceding_jobstream from full_job_list connect by prior parent_jobstream = jobstream ) ) order by depth, jobstream
SQL Fiddle
Refresh Fixed to get a complete list of tasks and add previous tasks.
Update2 Fixed a bug with the direction of the path.
source share