1

タスク テーブルからいくつかのデータを選択しようとしていますが、ユーザーが自分で作成した可能性のあるサブタスクは選択できません。そのため、すでにそのユーザーに割り当てられている task_id である parent_taskid を持つタスクを除外したいと考えています。

例えば

UserID | Parent_TaskID | TaskID
------ | ------------- | ------
435    | 149329        | 161280  
435    | 149330        | 210717  
435    | 149330        | 228100  
435    | 156991        | 149330  
169    | 161280        | 546540  
169    | 456842        | 458764

上記の表から、TaskID 210717 と 228100 は、親 (149330) が既にそのユーザーに割り当てられている taskID であるため、私の選択から削除されます - それらをサブタスクにします。- ただし、546540 は別のユーザーに割り当てられたタスク ID であるため、削除されません。

だから私は次のようなことを考えています

select Task.taskID, Task.Parent_taskID, Task.userID 
from task
where Task.Parent_TaskID not in (??? select taskID from task where ???)  

何か案は?

4

4 に答える 4

4
SELECT
    t1.taskID,
    t1.Parent_taskID,
    t1.userID 
FROM task t1
LEFT OUTER JOIN task t2
    ON t1.userID = t2.userID 
       AND t2.taskID = t1.Parent_taskId
WHERE t2.taskID IS NULL
于 2013-01-14T11:50:24.487 に答える
1

あなたのNOT IN意志

select t.taskID, t.Parent_taskID, t.userID 
from task t
where t.Parent_taskID not in (
    select tp.taskID
    from task tp
    where tp.userID = t.userID 
)

別の良い(そして読みやすい)解決策は、NOT EXISTS

select t.taskID, t.Parent_taskID, t.userID 
from task t
where not exists (
    select 1
    from task tp
    where tp.taskID = t.Parent_taskID
      and tp.userID = t.userID 
)
于 2013-01-14T11:47:52.670 に答える
1

左外部結合を使用し、次のように where ステートメントで null です。

SELECT
    t.taskID,
    t.Parent_taskID,
    t.userID 
FROM task t
LEFT OUTER JOIN task t2
    ON t2.taskID = t.Parent_taskID
    AND t2.userID = t.userID
WHERE ts.taskID IS NULL
于 2013-01-14T11:48:56.637 に答える
1

サブクエリを使用not existsして、同じ親を持つ行を除外できます。これは、タスクのレベルが 2 つしかなく、タスクが孫を持つことができない場合に機能します。

select  *
from    Table1 parent
where   not exists
        (
        select  *
        from    Table1 child
        where   parent.UserID = child.UserID
                and parent.Parent_TaskID = child.TaskID
        )

SQL Fiddle での実例。

于 2013-01-14T11:49:09.817 に答える