sql选择不在的地方

时间:2013-01-14 11:43:32

标签: sql sql-server tsql

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

E.g。

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

所以从上面的表格中可以看出TaskIDs 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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 
)

答案 2 :(得分: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

答案 3 :(得分: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
        )

Live example at SQL Fiddle.