문제

이 쿼리를 어떻게 최적화 할 수 있습니까? 이 작업을 수행하는 훨씬 쉬운 방법이 있어야합니다. 목표는 여전히 쉽게 삭제 된 진술로 바뀔 수 있다는 것입니다.

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
                 )
도움이 되었습니까?

해결책

이 쿼리를 한 눈에 볼 수 있으면 다음과 같습니다.

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

이벤트에 있지만 가입 테이블에 있지 않은 모든 팀을 찾으려고하는 것처럼 보였습니다. 이것이 정확합니까?

또한, 특히 하위 쿼리가 각 행에 의존하는 경우 (귀하의 경우에) 많은 하위 쿼리를 수행하는 것이 더 빨라질 것임을 주목하고 싶었습니다.

건배,
에릭

다른 팁

이 스레드에서 Eric의 쿼리에 대해 댓글을 달면 대신 실존 검사를 사용하는 것을 (MSSQLServer 배경에서) 권장합니다. 그렇게함으로써 (1) 당신의 의도를 더 명확하게 만들고 (2) 첫 번째 팀이 발견 된 후 일치하는 Team_ID에 대한 검사를 중단 할 수있는 기회를 제공합니다 (> = 1 일치하는 행은 실존 점검이 거짓이기 때문에). 예를 들어

t.schedule_id = s.schedule_id 내부 조인 이벤트 e에서 e.event_id = 183에서 t.schedule_id = s.schedule_id 내부 조인 이벤트 e에서 t. t. *에서 t. *를 선택하십시오. team_id)

그러나 MySQL 특정 성능 문제가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top