查询以根据一天中的时间识别重复项

时间:2017-12-06 20:47:19

标签: sql ms-access

SQL新手在这里。我有一张有训练师时间表的桌子。表格中的每条记录计划包含以下相关字段: 的 course_code 下, 的 training_date 下, 的 START_TIME 下, 的 END_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];

它会返回课程代码,其中任何一天都会多次预订培训师,但我想排除那些培训师在两个不同时间进行培训的记录。例如, OP1 可能会被教导 9:00 12:30 ,并且 OP2 被教授 12:30 16:00 。在这种情况下,这在我关心的日期内并不重复。如果培训师正在 8:00 教学 12:00 并且 10:30 教学 14,我确实希望看到记录:00

我的查询确实排除了一个 course_code ,因为该代码的重复项无关紧要。我对房间查询也会有同样的事情(无论有多少场外 房间重叠)。

我应该能够根据培训师查询设计房间查询,但如果两者都可以集成到一个查询中,那就太棒了。

1 个答案:

答案 0 :(得分:0)

一种方法使用相关子查询。以下内容应该在培训或房间的同一天发现任何时间重叠:

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
              );

请注意,这假定存在一个名为schedule_id的列,以防止查询发现任何给定记录与自身重叠。