2017-12-06 15 views
0

SQL初心者はここにあります。私はトレーナーのスケジュールのテーブルを持っています。テーブル内の各レコードは、スケジュールは、以下の関連フィールドが含まれています。 course_codetraining_dateのstart_timeEND_TIMEトレーナー部屋時間に基づいて重複を識別するクエリ

私はトレーナーまたは部屋が二重予約されたときにいつでも照会で識別することができます。クエリウィザードは私をかなり遠くまで導きますが、明らかに私の必要性はウィザードの能力よりも少し複雑です。私はこのクエリを生成することができた:

SELECT Schedule.[training_date], Schedule.[trainer], Schedule.[course_code] 
FROM Schedule 
WHERE (((Schedule.[training_date]) In (SELECT [training_date] FROM [Schedule] As Tmp GROUP BY [training_date],[trainer] HAVING Count(*)>1 And [trainer] = [Schedule].[trainer])) AND (Not (Schedule.[course_code])="OP00487")) 
ORDER BY Schedule.[training_date], Schedule.[trainer]; 

それはトレーナーは任意の日に複数回を計上しているコースコードを返しますが、私はトレーナーは、2つの異なる回を訓練され、それらのレコードを除外したいと思います。例えば、OP112:309時00を教えられるかもしれない、とOP2午後04時0012:30を教えています。この場合、これは私が気にする日付の中に重複しているわけではありません。私はトレーナーが14時12:00とも10:308時を教えている場合は、レコードを見たいん。

course_codeのクエリでは、そのコードの重複は関係がないため、1つを除外します。部屋のクエリでも同じことをします(オフサイト個の部屋が重複していません)。

私はトレーナークエリに基づいて部屋クエリを設計することができるはずですが、両方が1つのクエリに統合することができれば、それは素晴らしいだろう。

答えて

0

1つの方法では、相関サブクエリが使用されます。これは、任意のレコードは自分自身と重なっていることを見つけることからクエリを防止するschedule_idという列の存在を仮定することを

select s.* 
from schedule as s 
where exists (select 1 
       from schedule as s2 
       where (s2.trainer = s.trainer or s2.room = s.room) and 
        s2.training_date = s.training_date and 
        s2.start_time < s.end_time and 
        s2.end_time > s.start_time and 
        s2.schedule_id <> s.schedule_id 
      ); 

注:以下は、トレーニングや部屋のために同じ日に時間内の任意の重複を見つける必要があります。

+0

ありがとうございます。あなたは私がschedule_idを持っていることが正しいと思います。 –

+0

申し訳ありませんが、早すぎます。 テーブルに重複エントリを追加しようとしましたが、クエリに表示されません。 "as s"と "as s2"は使い易さのためにクエリ内でのみ定義されていると解釈するのは正しいですか?私はそれらを私のテーブルのものと置き換える必要はありません、そうですか? –

+0

@KevinElmore。 。 。これらは 'schedule'テーブルへの参照のエイリアスです。内部クエリーと外部クエリーでそれらが異なることが重要です。彼らが一貫して使用されている限り、彼らは特に重要ではありません。 –

関連する問題