Запрос на наличие нескольких отношений «многие ко многим»

У меня есть то, что кажется основным вопросом sql. У меня есть отношения многие ко многим через соединительную таблицу. Присвойте сотрудникам роли через EmployeeRoles

Table: EMPLOYEES
Columns: id, name, etc.

Table: ROLES
Columns: id, name

Table: EMPLOYEES_ROLES
Columns: employee_id, role_id

Как мне запросить сотрудника, который имеет две роли, скажем, администратора и руководителя? Бонусные баллы в Hibernate.


person David T    schedule 07.03.2019    source источник


Ответы (2)


Вы можете попробовать ниже -

select a.emp_id,b.name from employee_roles a
inner join EMPLOYEES b on a.emp_id=b.id
inner join roles c on a.role_id=c.id
where c.name in ('Admin' ,'Supervisor') and not exists 
     (select 1 from employee_roles a1
             inner join EMPLOYEES b1 on a1.emp_id=b1.id
             inner join roles c1 on a1.role_id=c1.id
             where a.emp_id=a1.emp_id and c1.name='Trainee')
group by a.emp_id,b.name
having count(distinct c.name)=2
person Fahmi    schedule 07.03.2019
comment
хорошо, бонусные баллы, как бы я мог запросить тех, у кого есть роли «Администратор» и «Супервизор», но у которых нет роли «Стажер», например. - person David T; 08.03.2019

Если вам не нужно знать, какие именно роли у сотрудников, вам даже не нужно обращаться к таблице ролей; просто получите список номеров employee_id, имеющих несколько записей в employee_roles, и присоедините эти значения employee_id к сотрудникам:

select e.name, count(x.role_id) as num_roles
from employee_roles x
join employees e
on (e.id = x.employee_id)
having count(x.role_id) >= 2;
person Don Del Grande    schedule 07.03.2019
comment
В этом случае мне нужно знать, какие у них роли, а не только то, что их больше одной. - person David T; 08.03.2019