質問

このクエリを最適化するにはどうすればよいですか?これを行うにはもっと簡単な方法があるはずです。目標は、削除ステートメントに簡単に変換できることです。

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一致する行により存在チェックがfalseになるため)。 例:

選択     t。* から     チームt     t.schedule_id = s.schedule_idの内部結合スケジュール     s.event_idの内部結合イベントe = e.event_id どこで     e.event_id = 183     存在しない(team_id = t.team_idのサインアップから*を選択)

ただし、mysql固有のパフォーマンスの問題がある可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top