Pergunta

Como posso optimizar esta consulta? Parece que deve haver uma maneira muito mais fácil de fazer isso. O objetivo é que ele ainda será capaz de ser facilmente transformado em uma instrução de exclusão.

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
                 )
Foi útil?

Solução

Um rápido olhar sobre esta consulta dá-me isto:

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

Parecia que você está tentando encontrar todas as equipes que estão em um evento, mas não estão na tabela de inscrição. É este precisa?

Além disso, eu queria nota que será mais rápido para fazer junta-se, em seguida, um monte de subconsultas, especialmente se os subqueries depender de cada linha (no seu caso, eles fazem).

Cheers,
Eric

Outras dicas

Comentando em consulta de Eric nesta discussão, eu recomendaria (do meu fundo mssqlserver) para usar uma verificação existencial vez. Ao fazê-lo (1) faz sua intenção mais clara e (2) dá o otimizador a oportunidade de parar o exame para um team_id correspondência após o primeiro é encontrado (desde> = 1 linha correspondente faz com que a verificação existencial ser falso). Por exemplo.

selecione t. * de equipe t junção interna programação s em t.schedule_id = s.schedule_id junção interna evento e em s.event_id = e.event_id Onde e.event_id = 183 e não existe (seleccionar * de inscrição onde team_id = t.team_id)

Mas talvez existam específica mysql perf preocupações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top