2016-10-09 15 views
-1

私はtodoリストアプリケーション用のデータベーステーブルを持っており、他のタスクに依存するタスクを追跡する方法が必要です。ID、タイトル、説明、IsComplete、DependsOnTask列のテーブルがあります。与えられた別のタスクが依存しているタスク。SQLでデータを照合する方法を教えてください。

問題は、私が以下のSQLを試してみても、結果は得られません!

私の質問は、DependsOnTaskと一致する一意の識別子を持つすべてのレコードを見つける方法はありますか?事前に

感謝:)

+0

使うのは悪い習慣です

;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 

をあなたが必要なすべてを持ってますユーザテーブル用の 'master'データベースちょっとメモ! :) – gofr1

+0

私はこれを知っているが、それは生産コードではない:) –

答えて

3

あなたはJOINが欠落しています

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

これは、そのレコードからの情報とともに、DependsOnTaskがnullでないすべてのタスクを返します。

注:

  • あなたは、彼らが必要ないときに角括弧を使用する必要はありません。彼らは単にクエリを混乱させます。
  • テーブルのエイリアスを使用し、カラム名を修飾すると、カラムの出所を知ることができます。
  • 同じテーブルに戻って参照する場合は、明示的にJOINを使用する必要があります。
0

階層構造を持ち、タスクが親を持ち、その親が別のタスクの子である場合、再帰的なCTEを使用して、決定されたタスクのすべての階層を見つけることができます。

例を示しましょう。

あなたは、このような構造を持って:だからタスク1が2つのタスクがある

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子を持って3と4を - 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を変更する場合:親タスク、子タスクと彼らが依存するものです::

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 
関連する問題