如何在SQL中查找匹配数据?

时间:2016-10-09 12:53:10

标签: sql-server

我有一个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匹配的唯一标识符的所有记录?

提前致谢:)

2 个答案:

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