我已经建模了作业,它是sql表中的依赖项:
工作(id,detail,exit_code)
依赖项(job_id,dependenet_job_id)
例如:如果作业1取决于2和3,则表格将具有以下内容:
工作
1“job1”NULL
2“job2”NULL
3“job3”NULL
4“job4”NULL
依赖性
1 2
1 3
现在我需要找到下一步可以运行的工作。在上面的情况下,可以运行2,3和4,因为它们没有任何依赖性。 1只能在2和3成功完成时运行(退出代码= 0)。
这些表可以有数百个作业和多级依赖项。我有查询使用左外连接获得没有依赖关系的作业。但是找不到成功完成依赖的作业有困难。
感谢。
答案 0 :(得分:0)
查询的形式是“选择没有完成的依赖作业的作业”
Select
*
from
jobs j
where
not exists (
select
'x'
from
dependencies d
inner join
jobs j2
on d.dependent_job_id = j2.id
where
j.id = d.job_id and (
j2.exit_code is null or -- job hasn't completed successfully
j2.exit_code != 0
)
);
<强> Example SQLFiddle 强>
答案 1 :(得分:0)
对于“嵌套”依赖项(即job1依赖于取决于job3的job2),您需要一个递归查询,MySQL不支持它。
您可以查看有关如何reengineer your tables处理递归的文章。
你可以做的另一件事是:
只要作业完成,就会删除或停用其依赖项(将一个布尔列active
添加到依赖关系表中)。
这样,您可以运行
SELECT jobs.* FROM jobs
LEFT JOIN depends ON (jobs.id = depends.parent_id AND depends.active = TRUE)
WHERE depends.child_id IS NULL
AND jobs.started = FALSE;
这将返回所有尚未启动但没有活动依赖项的作业。
选择作业后,即可运行
UPDATE jobs SET started=TRUE WHERE id = @JOB_ID;
当它结束时,
UPDATE jobs SET exitcode=@EXIT_CODE WHERE id = @JOB_ID;
UPDATE dependencies SET active = FALSE WHERE child_id = @JOB_ID;
-- or
DELETE FROM dependencies WHERE child_id = @JOB_ID;