Mysql查询查找已完成依赖项的作业

时间:2013-11-02 23:24:18

标签: mysql sql


我已经建模了作业,它是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)。

这些表可以有数百个作业和多级依赖项。我有查询使用左外连接获得没有依赖关系的作业。但是找不到成功完成依赖的作业有困难。

感谢。

2 个答案:

答案 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;