2016-10-09 2 views
-1

У меня есть таблица базы данных для приложения списка задач, и мне нужен способ отслеживания задач, зависящих от других задач. У меня уже есть таблица с идентификаторами, заголовком, описанием, IsComplete и столбцом DependsOnTask, содержащая уникальный идентификатор для задачи зависит другая заданная задача.Как найти подходящие данные в SQL?

проблема в том, что, когда я пытаюсь сделать это в SQL, он не дает никаких результатов!

SELECT TOP 1000 [id] 
     ,[title] 
     ,[description] 
     ,[complete] 
     ,[DependsOnTask] 
    FROM [master].[dbo].[ToDoItems] where ToDoItems.id =ToDoItems.DependsOnTask; 

Итак, мой вопрос в том, есть ли способ найти все записи с уникальным идентификатором, соответствующим DependsOnTask?

Заранее спасибо :)

+0

Это плохая практика использования 'master' для пользовательских таблиц. Просто заметьте! :) – gofr1

+0

Я знаю это, но это не производственный код :) –

ответ

3

Вы пропускаете JOIN:

SELECT tdi.*, dot.* 
FROM dbo.ToDoItems tdi JOIN 
    dbo.ToDoItems dot 
    ON dot.id = tdi.DependsOnTask; 

Это возвращает все задачи, где DependsOnTask не равно нулю, наряду с информацией из этой записи.

Примечания:

  • Вам не нужно использовать квадратные скобки, когда они не нужны. Они просто загромождают запросы.
  • Используйте псевдонимы таблиц и укажите имена столбцов, чтобы вы знали, откуда берутся столбцы.
  • Для ссылки на ту же таблицу необходимо использовать явный JOIN.
0

Если у вас иерархическая структура и задача могут иметь родителя, а родитель - дочерний объект для другой задачи, yo может использовать рекурсивный 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. четвёртая задача получил 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.

Если вы измените КТР, как это:

;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 
Смежные вопросы