Tsql 查找所有子表值满足要求的父表

Tsql 查找所有子表值满足要求的父表,tsql,Tsql,我想找到所有相关任务都已完成的未完成请求。在这些请求中查找最新完成任务的用户电子邮件。也就是说,我需要返回RequestID、TaskID、UpdateDate和电子邮件 这是我的疑问: select r.RequestID,r.UpdatedDate,u.Email from Request r left outer join Task t1 on r.RequestID = t1.RequestID left outer join Task t2 on r.RequestID = t2.R

我想找到所有相关任务都已完成的未完成请求。在这些请求中查找最新完成任务的用户电子邮件。也就是说,我需要返回RequestID、TaskID、UpdateDate和电子邮件

这是我的疑问:

select r.RequestID,r.UpdatedDate,u.Email
from Request r 
left outer join Task t1 on r.RequestID = t1.RequestID
left outer join Task t2 on r.RequestID = t2.RequestID and t2.UpdatedDate > t1.UpdatedDate
left outer join Users u on t1.AssignedEmp = u.UserID
where r.RequestStatusID in (2,6) and t1.TaskStatusID in (2,5)
and t2.RequestID is null
此查询提供每个请求的最新完成或取消的任务,但同一请求中还有其他任务尚未完成。例如,这些记录:

RequestID = 1
TaskID = 1, TaskStatusID = 2 (completed) UpdatedDate = '20150417'
TaskID = 2, TaskStatusID = 3 (InProgress)UpdatedDate = '20150416'
将选择此请求。但我不想要它。我希望所有TaskStatusID=已完成或已取消

我怎么修理它?谢谢

尝试使用相关的不存在子查询筛选出至少有一个未完成任务的请求。使用“应用”获取最近更新任务的电子邮件

select
    r.RequestID,
    r.UpdatedDate,
    u.Email
from Request as r
cross apply (
    select top (1) u.Email
    from Task as t
    inner join Users as u
    on t.AssignedEmp = u.UserID
    where t.RequestID = r.RequestID
    order by r.UpdatedDate desc
) as u /* the user associated with the most recently updated task */
where not exists (
    select *
    from Task as t
    where t.RequestID = r.RequestID
    and t.TaskStatusID <> 2
) /* a not completed task does not exist */
and r.RequestStatusID <> 2 /* the request is not completed */
你可以在室内使用


我终于解决了这个问题

select r.RequestID, 
t.UpdatedOn, u.FirstName + ' ' + u.LastName as UserName, u.Email
from Request r
join
    (

    select RequestID,AssignedEmp, TaskID, Row_Number() OVER (Partition By RequestID Order By UpdatedDate desc) AS RowNo , UpdatedDate, TaskStatusID
    from Task
    where RequestID not in ( select t1.RequestID
                    from Task t1
                    where t1.TaskStatusID not in (2,5)
                    group by t1.RequestID, t1.TaskID
                    )
    ) t                 
on r.RequestID = t.RequestID and t.RowNo = 1
and r.RequestStatusID in (2,6)
join Users u on t.AssignedEmp = u.UserID
order by r.RequestID desc

@JoeStefanelli-我想你有点扭曲了。WHERE t2.RequestId为null的左外部联接将仅拾取在t2中未找到匹配项或列实际为null的行。2,5中的表达式t1.TaskStatusID不允许为空,它将有效地将t1上的左外部联接更改为内部联接。@您说得对。我猜是星期五下午脑抽筋-如果我了解你想要什么,有几种方法。您可以按RequestId对已完成任务组进行计数,并将其与按RequestId对所有任务组进行计数进行比较。如果计数与请求匹配,则所有任务都已完成。另一种方法是检查每个不同的RequestId,以查看是否存在未完成的任务,如果存在,则过滤掉请求。
select r.RequestID, 
t.UpdatedOn, u.FirstName + ' ' + u.LastName as UserName, u.Email
from Request r
join
    (

    select RequestID,AssignedEmp, TaskID, Row_Number() OVER (Partition By RequestID Order By UpdatedDate desc) AS RowNo , UpdatedDate, TaskStatusID
    from Task
    where RequestID not in ( select t1.RequestID
                    from Task t1
                    where t1.TaskStatusID not in (2,5)
                    group by t1.RequestID, t1.TaskID
                    )
    ) t                 
on r.RequestID = t.RequestID and t.RowNo = 1
and r.RequestStatusID in (2,6)
join Users u on t.AssignedEmp = u.UserID
order by r.RequestID desc