1

我无法编写 SQL 来根据多对多关系中的条件对记录进行排序。我有tasks用于任务依赖关系的多对多表的表结构。例如,任务 C 可以通过 table 对其他任务有一个或多个依赖项task_dependencies

  • 任务:id、user_id、status_id、date_due、...
  • TASK_DEPENDENCIES:task_id、dependency_task_id(数据透视表)
  • 状态如下:Q-新、G-进行中、L-关闭

任务依赖的想法是一个任务在所有依赖任务都关闭之前不能启动。我想选择所有用户的打开任务。这很简单。但是我需要按 date_due 对它们进行排序,但是在结果集的末尾,所有具有依赖关系的任务都无法启动。这意味着我需要以某种方式检查所有依赖任务是否已关闭并在以某种方式排序时考虑到这一点?

我设法将一个选择放在一起,但这总是将所有具有依赖关系的任务放在记录集的末尾。但我想将具有封闭依赖关系的任务放在正常的 date_due 订单流中......

SELECT 
   T.id, T.description, TD.dependency_task_id, 
   ISNULL(TD.dependency_task_id) AS NoDependency, T.date_due
FROM tasks T 
LEFT OUTER JOIN task_dependencies TD 
  ON T.id = TD.task_id 
WHERE assigned_user_id=1
ORDER BY NoDependency DESC, T.date_due

这是 SQL 小提琴:http ://sqlfiddle.com/#!2/894f7/3 。

4

1 回答 1

0

试试这个。它OR在 select 语句中使用来查看是否dependency_task_id is null或它是否正在status = 'L'连接回tasks表以进行查找。

SELECT T.id, T.description, TD.dependency_task_id, 
  ISNULL(TD.dependency_task_id) OR t2.status_id = 'L'  AS NoDependency, 
  T.date_due
FROM tasks T 
  LEFT OUTER JOIN task_dependencies TD 
    ON T.id = TD.task_id 
  LEFT OUTER JOIN tasks t2 
    ON TD.dependency_task_id = T2.id 
WHERE T.assigned_user_id=1
ORDER BY NoDependency DESC, T.date_due
于 2013-10-10T17:07:38.747 回答