我有一个todo列表应用程序的数据库表,我需要一种方法来跟踪依赖于其他任务的任务,我已经有一个包含ID,title,description,IsComplete和DependsOnTask列的表,包含唯一的另一个给定任务所依赖的任务的标识符。
问题是,当我在SQL中尝试以下内容时,它不会给出任何结果!
SELECT TOP 1000 [id]
,[title]
,[description]
,[complete]
,[DependsOnTask]
FROM [master].[dbo].[ToDoItems] where ToDoItems.id =ToDoItems.DependsOnTask;
所以我的问题是,有没有办法找到与DependsOnTask匹配的唯一标识符的所有记录?
提前致谢:)
答案 0 :(得分:3)
您错过了JOIN
:
SELECT tdi.*, dot.*
FROM dbo.ToDoItems tdi JOIN
dbo.ToDoItems dot
ON dot.id = tdi.DependsOnTask;
这将返回DependsOnTask
不为空的所有任务,以及该记录中的信息。
注意:
JOIN
作为对同一表的引用。答案 1 :(得分:0)
如果你有一个层次结构,任务可以有一个父,那个父是另一个任务的子,你可以使用递归CTE来查找确定任务的所有层次结构。
让我举个例子。
你有这样的结构:
SELECT *
FROM (VALUES
(1,'Title1','Do some stuff 1', 0, NULL),
(2,'Title2','Do some stuff 2', 0, NULL),
(3,'Title3','Do some stuff 3', 1, 1),
(4,'Title4','Do some stuff 4', 1, 1),
(5,'Title5','Do some stuff 5', 0, 2),
(6,'Title6','Do some stuff 6', 1, 2),
(7,'Title7','Do some stuff 7', 0, 4),
(8,'Title8','Do some stuff 8', 0, NULL)
) as t([id],[title],[description],[complete],[DependsOnTask])
因此,任务1有2个子任务--3和4。第4个任务有1个孩子 - 7.你想用id = 1
获得任务的所有子任务:
DECLARE @taskid int = 1
;WITH cte AS (
SELECT [id]
,[title]
,[description]
,[complete]
,[DependsOnTask]
FROM [ToDoItems]
WHERE [id] = @taskid
UNION ALL
SELECT t.*
FROM [ToDoItems] t
INNER JOIN cte c
ON c.id = t.DependsOnTask
)
SELECT *
FROM cte
输出:
id title description complete DependsOnTask
1 Title1 Do some stuff 1 0 NULL
3 Title3 Do some stuff 3 1 1
4 Title4 Do some stuff 4 1 1
7 Title7 Do some stuff 7 0 4
因此,如果您将上次选择更改为:
SELECT @taskid as main,
id,
DependsOnTask
FROM cte
你会得到:
main id DependsOnTask
1 1 NULL
1 3 1
1 4 1
1 7 4
所以你得到Task1
的所有子任务。
如果你改变这样的CTE:
;WITH cte AS (
SELECT [id]
,[title]
,[description]
,[complete]
,[DependsOnTask]
,[id] as Parent
FROM [ToDoItems]
WHERE [DependsOnTask] IS NULL
UNION ALL
SELECT t.*,
c.Parent
FROM [ToDoItems] t
INNER JOIN cte c
ON c.id = t.DependsOnTask
)
SELECT Parent,
id,
DependsOnTask
FROM cte
您将获得所需:父任务,子任务以及他们依赖的内容:
Parent id DependsOnTask
1 1 NULL
2 2 NULL
8 8 NULL
2 5 2
2 6 2
1 3 1
1 4 1
1 7 4