我正在尝试从任务表中选择一些数据,但不是用户可能为自己创建的任何子任务。因此,我想过滤掉任何具有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 ???)
有什么想法吗?
答案 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
)