在子表的所有行上检查条件

时间:2018-08-29 18:36:28

标签: sql-server tsql

我有两个表,例如:

任务表:

TaskID , TaskName

,然后 TaskDetails 表:

TaskDetailsID, TaskID, CompletionDate

我想写一个查询给我所有任务,这些任务的所有任务详细信息已在最近10天内完成。

如何编写这样的查询?我不想使用cursors,并且尝试使用INNER JOIN,但是它返回太多记录。因此,我认为还需要其他一些东西,但不确定是什么。

3 个答案:

答案 0 :(得分:1)

如果您需要更多列详细信息,我会这样做

SELECT T.Task_Name,
       TMP.TaskDetailsID, 
       TMP.TaskID,
       TMP.CompletionDate
  FROM (SELECT TD.*,
               MIN(CompletionDate) OVER
                 ( PARTITION BY TaskID ) mn_CompDate
          FROM Task_Details TD
       ) TMP
 INNER
  JOIN Task T
    ON TMP.taskID = T.taskID
 WHERE TMP.mn_CompDate >= dateadd(day, -10, getdate());

答案 1 :(得分:1)

对于SQL Server,请尝试以下操作:

SELECT * FROM Tasks t
WHERE NOT EXISTS(SELECT 1 FROM TaskDetails
                 WHERE t.TaskID = TaskID
                 AND CompletionDate < DATEADD(DAY, -10, GETDATE()))

或针对MySQL:

SELECT * FROM Tasks t
WHERE NOT EXISTS(SELECT 1 FROM TaskDetails
                 WHERE t.TaskID = TaskID
                 AND CompletionDate < DATE_ADD(NOW(), INTERVAL -10 DAY))

答案 2 :(得分:0)

您将使用聚合和having

select td.taskid
from taskdetails td
group by td.taskid
having min(td.completiondate) >= dateadd(day, -10, getdate());