例如,我有两个表:
任务表:
TaskID , TaskName
然后是 TaskDetails表:
TaskDetailsID, TaskID, CompletionDate
我想写一个查询来给我他们所有的任务细节在过去 10 天内完成的所有任务。
我该如何编写这样的查询?我不想使用cursors并且我尝试使用INNER JOIN但它返回的记录太多。所以我认为需要其他东西,但不确定它是什么。
例如,我有两个表:
任务表:
TaskID , TaskName
然后是 TaskDetails表:
TaskDetailsID, TaskID, CompletionDate
我想写一个查询来给我他们所有的任务细节在过去 10 天内完成的所有任务。
我该如何编写这样的查询?我不想使用cursors并且我尝试使用INNER JOIN但它返回的记录太多。所以我认为需要其他东西,但不确定它是什么。
如果您需要更多列详细信息,我会这样做
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());
在 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))
您将使用聚合和having:
select td.taskid
from taskdetails td
group by td.taskid
having min(td.completiondate) >= dateadd(day, -10, getdate());