2009-04-30 11 views
0

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

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 
       ) 
+0

データについてもう少し説明し、クエリが何をすべきか、または返すべきですか? –

+1

そして、コードをちょっとフォーマットするのはどうでしょう... –

+1

私はコードを書式設定しました。すべてのSQLのものを大文字で、テーブル、カラム、エイリアスを小さく書くことは非常に役に立ちます。次に、コードをインデントするのも良い考えです。この方法で、実際にクエリが何をしているのかを見ることができます。 – markus

答えて

3

このクエリでチラッは私にこれを与える:

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 

あなたがイベントであるが、サインアップテーブルに含まれていないすべてのチームを見つけようとしているように見えました。これは正確ですか?

また、サブクエリが各行に依存する場合(特に、サブクエリがサブクエリを使用する場合)は、ジョインよりも高速にサブクエリを実行することに注意したいと思います。

乾杯、このスレッドではエリックのクエリにコメント
エリック

+0

ありがとう、それはまさに私が望んでいたものです。私はまださまざまな種類の結合をうまく利用できるように取り組んでいます。 (2番目の内部結合では、それは実際にはs.event_id = e.event_idで、schedule_idではないことに注意してください) – Craig

+0

修正され、喜んで助けられました! – Eric

+1

SQLの方がいいので、クエリのクエリプランを確認してください。最適化を完了したい場合は、それが高速であることを確実にしたいでしょう。テーブルが大きい場合(または最終的に大きくなる場合)、適切なインデックスがない場合、クエリは遅く実行されます。インデックスを追加してから書き込みが遅くなったら、別の質問を投稿すれば答えます。 – yetanotherdave

0

は、私が代わりに実存チェックを使用するために(私のMSSQLSERVERのバックグラウンドから)をお勧めします。 (2)一致するteam_idが最初に見つかった後に(オプティマイザが> = 1の一致する行から存在チェックが偽になるため)、検査を停止する機会を与えます。 など。

トンを選択します。* からチームトン インナーはt.schedule_id = s.schedule_id がs.event_id = e.event_id どこ e.event_id = 183 にイベントeを内部ジョインスケジュールSに参加し、存在しない(select * from team_id = t.team_id)

しかし、おそらくmysql固有のperfの懸念があります。

関連する問題