Я бы подумал об этом как о присоединении к студентам с meetsat
. Таким образом, это дает студентам время их занятий:
select s.sname, c.meets_at
from students s join
enrolls e
on s.snum = e.snum join
classes c
on c.cname = e.cname;
Затем, чтобы получить дубликаты, используйте агрегацию и фильтр, используя having
:
select s.snum, s.sname, c.meets_at, count(*) as cnt
from students s join
enrolls e
on s.snum = e.snum join
classes c
on c.cname = e.cname
group by s.snum, sname, c.meets_at
having count(*) >= 2;
Обратите внимание, что это включает в себя идентификаторы, а также имя, потому что два студента могут иметь одинаковое имя.
Наконец, у ученика может быть несколько пар классов, которые конфликтуют, но вы хотите увидеть ученика только один раз. Хотя вышеприведенного, вероятно, достаточно для ваших целей, более точное решение указанной проблемы будет следующим:
select distinct s.sname
from students s join
enrolls e
on s.snum = e.snum join
classes c
on c.cname = e.cname
group by s.snum, sname, c.meets_at
having count(*) >= 2;