Минимальное количество совпадений больше

Я не знаю, как решить эту проблему: есть 3 таблицы (проект, инженер и клиент). Я хочу знать имена клиентов, которые наняли 2 или более разных инженеров, которые зарабатывают больше, чем X.

Таблица "проект" содержит идентификаторы клиента и инженера, а также другие параметры. Информация о имени клиента и зарплате инженера содержится в "клиенте" и "инженере" соответственно.

select name 
from client, project
where project.client_number IN
    (
    select p.client_number
    from project p inner join engineer e on (p.eng_number=e.eng_number)
    where e.salary>50000
    group by p.client_number
    having count (distinct p.eng_number)>2
    )

group by client.name
;

2 ответа

Вы были довольно близко

select name 
from client
where client_number IN
  (
    select p.client_number
    from project p inner join engineer e on (p.eng_number=e.eng_number)
    where e.salary>50000
    group by p.client_number
    having count (distinct p.eng_number)>2
  )

Я не уверен, что понимаю вас правильно, но этот подход должен работать с небольшими изменениями: начните с инженера, который зарабатывает более 50000:

(select * from engineer where salary>50000 ) e

присоединиться к таблице проекта:

inner join 
(select * from projects ) p -- this is overkill - just to give an option to filter on this level can be replaced by projects p
on (p.eng_number=e.eng_number)

теперь присоединяйтесь к таблице клиентов

inner join 
(select * from clients ) c  -- this is overkill - just to give an option to filter on this level. can be replaced by clients c
on (p.client_number=e.client_number) 

Теперь вы можете обернуть его с помощью внешнего выбора с любыми фильтрами и сгруппировать по

select name from (
(select * from engineer where salary>50000 ) e
inner join 
(select * from projects ) p 
on (p.eng_number=e.eng_number)
inner join 
(select * from clients ) c  
on (p.client_number=e.client_number)
) epc
group by c.client_number
having count (distinct p.eng_number)>2 
Другие вопросы по тегам