Comprobación de una condición en todas las filas de una tabla secundaria

Tengo dos tablas por ejemplo:

Tasks table:

TaskID , TaskName

y luego la tabla Detalles de tarea :

TaskDetailsID, TaskID, CompletionDate

Quiero escribir una consulta para darme todas las tareas en las que todos los detalles de sus tareas se han completado en los últimos 10 días.

¿Cómo puedo escribir tal consulta? No quiero usar cursores e intenté usar INNER JOIN pero está devolviendo demasiados registros. Así que creo que se necesita algo más, pero no estoy seguro de qué es.

0
Debe etiquetar RDBMS que está utilizando.
agregado el autor Michał Turczyn, fuente
Debe etiquetar RDBMS que está utilizando.
agregado el autor Michał Turczyn, fuente
¿Puede haber tareas incompletas, es decir, filas con CompletionDate configuradas en NULL?
agregado el autor HABO, fuente
¿Puede haber tareas incompletas, es decir, filas con CompletionDate configuradas en NULL?
agregado el autor HABO, fuente
¿Puede haber tareas incompletas, es decir, filas con CompletionDate configuradas en NULL?
agregado el autor HABO, fuente

6 Respuestas

Intente esto para SQL Server:

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

o esto, para MySQL:

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

Lo haría así si necesitas más detalles de columna.

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
agregado
Gracias, me refiero solo a encontrar tareas en las que TODOS los detalles de sus tareas se hayan completado en los últimos 10 días ... así que, por ejemplo, si una tarea tiene tres detalles de tareas, todos se completan también PERO uno de ellos tiene una fecha de finalización que va De vuelta a hace tres meses, entonces no queremos devolver esta tarea como resultado
agregado el autor Bohn, fuente
¿Por qué necesito lo más temprano?
agregado el autor Bohn, fuente
¿Para qué sirve "MIN" en esa consulta?
agregado el autor Bohn, fuente
Obtenga la fecha de finalización más temprana para una tarea que
agregado el autor Error_2646, fuente
Depende. ¿Qué quiere decir con "todos los detalles de la tarea se han completado en los últimos 10 días"? Si quiere decir que no hay detalles de tareas completadas antes de 10 días, es por eso que lo necesita. Si te refieres a otra cosa, los datos de muestra y el resultado esperado aclararían la ambigüedad.
agregado el autor Error_2646, fuente
Bueno, en ese caso, la fecha mínima sería hace 3 meses y se eliminaría aquí DONDE TMP.mn_CompDate> = dateadd (day, -10, getdate ());
agregado el autor Error_2646, fuente

Lo haría así si necesitas más detalles de columna.

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
agregado
Gracias, me refiero solo a encontrar tareas en las que TODOS los detalles de sus tareas se hayan completado en los últimos 10 días ... así que, por ejemplo, si una tarea tiene tres detalles de tareas, todos se completan también PERO uno de ellos tiene una fecha de finalización que va De vuelta a hace tres meses, entonces no queremos devolver esta tarea como resultado
agregado el autor Bohn, fuente
¿Por qué necesito lo más temprano?
agregado el autor Bohn, fuente
¿Para qué sirve "MIN" en esa consulta?
agregado el autor Bohn, fuente
Obtenga la fecha de finalización más temprana para una tarea que
agregado el autor Error_2646, fuente
Depende. ¿Qué quiere decir con "todos los detalles de la tarea se han completado en los últimos 10 días"? Si quiere decir que no hay detalles de tareas completadas antes de 10 días, es por eso que lo necesita. Si te refieres a otra cosa, los datos de muestra y el resultado esperado aclararían la ambigüedad.
agregado el autor Error_2646, fuente
Bueno, en ese caso, la fecha mínima sería hace 3 meses y se eliminaría aquí DONDE TMP.mn_CompDate> = dateadd (day, -10, getdate ());
agregado el autor Error_2646, fuente

Usaría la agregación y teniendo :

select td.taskid
from taskdetails td
group by td.taskid
having min(td.completiondate) >= dateadd(day, -10, getdate());
0
agregado
por lo que no es necesario utilizar la tabla "Tareas", ¿la matriz?
agregado el autor Bohn, fuente
también dice syntx incorrecto porque CompletionDate está en tener pero no en GroupBy
agregado el autor Bohn, fuente
@Bohn. . . Eso no tiene sentido. CompletionDate es el argumento de una función de agregación. Está bien en el grupo por . Esta es una solución simple a la pregunta.
agregado el autor Gordon Linoff, fuente

Usaría la agregación y teniendo :

select td.taskid
from taskdetails td
group by td.taskid
having min(td.completiondate) >= dateadd(day, -10, getdate());
0
agregado
por lo que no es necesario utilizar la tabla "Tareas", ¿la matriz?
agregado el autor Bohn, fuente
también dice syntx incorrecto porque CompletionDate está en tener pero no en GroupBy
agregado el autor Bohn, fuente
@Bohn. . . Eso no tiene sentido. CompletionDate es el argumento de una función de agregación. Está bien en el grupo por . Esta es una solución simple a la pregunta.
agregado el autor Gordon Linoff, fuente

Usaría la agregación y teniendo :

select td.taskid
from taskdetails td
group by td.taskid
having min(td.completiondate) >= dateadd(day, -10, getdate());
0
agregado
por lo que no es necesario utilizar la tabla "Tareas", ¿la matriz?
agregado el autor Bohn, fuente
también dice syntx incorrecto porque CompletionDate está en tener pero no en GroupBy
agregado el autor Bohn, fuente
@Bohn. . . Eso no tiene sentido. CompletionDate es el argumento de una función de agregación. Está bien en el grupo por . Esta es una solución simple a la pregunta.
agregado el autor Gordon Linoff, fuente