1

我正在尝试从任务表中选择一些数据,但不是用户可能为自己创建的任何子任务。所以,我想过滤掉任何具有 parent_taskid 的任务,它是已经分配给该用户的 task_id。

例如

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 不会被删除,因为它是分配给另一个用户的 taskID。

所以我在想类似的东西

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子查询来过滤掉具有相同父项的行。如果只有两个级别的任务,并且任务不能有孙子,则此方法有效。

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