Pregunta

¿Cómo puedo optimizar esta consulta? Parece que debería haber una manera mucho más fácil de hacer esto. El objetivo es que aún pueda convertirse fácilmente en una declaración de eliminación.

SELECT * FROM team 
WHERE team_id IN (
                  SELECT team_id 
                  FROM (
                        SELECT team.team_id, (
                                              SELECT COUNT(*) 
                                              FROM signup 
                                              WHERE signup.team_id = team.team_id
                                             ) AS members 
                        FROM team, schedule, event 
                        WHERE team.schedule_id = schedule.schedule_id 
                        AND schedule.event_id = event.event_id
                        AND event.event_id =183) AS t 
                  WHERE members = 0
                 )
¿Fue útil?

Solución

Un vistazo rápido a esta consulta me da esto:

select
    t.*
from
    team t
    inner join schedule s on t.schedule_id = s.schedule_id
    inner join event e on s.event_id = e.event_id
    left outer join signup sp on t.team_id = sp.team_id
where
    e.event_id = 183
    and sp.team_id is null

Parecía que estabas tratando de encontrar todos los equipos que están en un evento pero que no están en la tabla de registro. ¿Es esto exacto?

Además, quería señalar que será más rápido hacer uniones que un montón de subconsultas, especialmente si las subconsultas dependen de cada fila (en su caso, lo hacen).

Saludos,
Eric

Otros consejos

Al comentar la consulta de Eric en este hilo, recomendaría (desde mi fondo mssqlserver) utilizar una verificación existencial en su lugar. Al hacerlo (1) aclara su intención y (2) le da al optimizador la oportunidad de dejar de examinar un id_de_ equipo después de encontrar el primero (ya que > = 1 fila correspondiente hace que la verificación existencial sea falsa). Por ejemplo,

seleccione     t. * desde     equipo t     programación de unión interna s en t.schedule_id = s.schedule_id     evento de unión interna e en s.event_id = e.event_id dónde     e.event_id = 183     y no existe (seleccione * del registro donde team_id = t.team_id)

Pero tal vez haya inquietudes de rendimiento específicas de mysql.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top