基于条件的SQL排序记录在多对多关系中

问题描述:

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

  • 任务: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

试试看。它在select语句中使用OR来查看dependency_task_id is nullstatus = '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 
+0

看起来更好,但并不完美。问题是具有多个依赖关系的任务在结果集中多次列出...每个任务应该只在列表中一次!如果列表中依赖项之一仍然处于打开状态,则应在尚未准备好启动的任务之间的最后对其进行排序。 –

+0

你可以在你的SQLfiddle中查找ID为811的任务,它会列出两次。试图找出如何解决这个问题。 –

+0

@PrimozRome - 这项工作:http://sqlfiddle.com/#!2/894f7/9 – sgeddes