Sql 正在尝试理解延迟的作业轮询查询

Sql 正在尝试理解延迟的作业轮询查询,sql,ruby-on-rails,haskell,delayed-job,Sql,Ruby On Rails,Haskell,Delayed Job,我正在尝试将延迟的作业移植到Haskell,但无法理解DJ为轮询下一个作业而触发的查询中的WHERE子句: UPDATE "delayed_jobs" SET locked_at = '2017-07-18 03:33:51.729884', locked_by = 'delayed_job.0 host:myhostname pid:21995' WHERE id IN ( SELECT id FROM "delayed_jobs" WHERE ( (

我正在尝试将延迟的作业移植到Haskell,但无法理解DJ为轮询下一个作业而触发的查询中的WHERE子句:

UPDATE "delayed_jobs"
SET locked_at = '2017-07-18 03:33:51.729884',
    locked_by = 'delayed_job.0 host:myhostname pid:21995'
WHERE id IN (
  SELECT id FROM "delayed_jobs"
  WHERE
  (
      (
        run_at <= '2017-07-18 03:33:51.729457'
        AND (locked_at IS NULL OR locked_at < '2017-07-17 23:33:51.729488')
        OR locked_by = 'delayed_job.0 host:myhostname pid:21995'
      )
      AND failed_at IS NULL
  ) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *
在run_at_条件和locked_at_条件或locked_by_条件中是否缺少一组内括号?AND/OR条款的评估优先级是多少? “按_锁定”条件的目的是什么?它似乎正在拾取已被当前DJ进程锁定的作业?!
这个声明可能是好的。整个语句的上下文是通过将其locked_设置为/locked_by字段来锁定最高优先级的作业

where条件是这样的:如果run_at比现在早,它就到期了,它要么没有被锁定,要么在四个多小时前被锁定。。。或者,如果是我锁定了它,这一切都会被覆盖,当然,如果它没有失败,那么就锁定它。所以,如果我读对了,它看起来有点像是在运行准备运行的东西,但是有一个超时,这样东西就不会永远被锁定

对于第二个问题,其优先级高于或:

前两种说法意思相同,第三种说法不同


第二点可能只是粗略的所有权制度?如果当前进程是锁定某个对象的进程,它应该能够覆盖该锁定。

您询问的是SQL,但您用两个不相关的标记标记了您的问题,而不是SQL。请告诉我Haskell的进展情况@Reinhenrich感谢您指出:
(run_at_condition AND locked_at_condition OR locked_by_condition) 
AND failed_at_condition
SELECT 'yes' WHERE false AND false OR true;   -- 'yes', 1 row
SELECT 'yes' WHERE (false AND false) OR true; -- 'yes', 1 row
SELECT 'yes' WHERE false AND (false OR true); -- 0 rows