2015-03-19 1 views
1

Две таблицы. Один ко многим. Как найти все компании, где абсолютно все сотрудники работают в ИТ-отделах и имеют зарплату более 150000 долларов?SQL: найти все строки, которые ссылаются на строки, удовлетворяющие определенным условиям.

[COMPANIES] 

|----|--------------| 
| id | company_name | 
|----|--------------| 
| 1 | Google  | 
| 2 | Apple  | 
|----|--------------| 

[EMPLOYEES] 

|----|------------|------|------------|--------| 
| id | company_id | name | department | salary | 
|----|------------|------|------------|--------| 
| 1 | 1   | John | IT   | 200000 | 
| 2 | 1   | Bob | IT   | 200000 | 
| 3 | 2   | Rick | Design  | 100000 | 
| 4 | 2   | Bill | Design  | 100000 | 
|----|------------|------|------------|--------| 

ответ

2

Вы могли бы использование EXISTS + NOT EXISTS

SELECT c.* 
FROM COMPANIES c 
WHERE EXISTS 
(
    SELECT 1 FROM EMPLOYEES e 
    WHERE e.company_id = c.id 
    AND e.salary > 150000 
    AND e.department = 'IT' 
) 
AND NOT EXISTS 
(
    SELECT 1 FROM EMPLOYEES e 
    WHERE e.company_id = c.id 
    AND (e.salary <= 150000 OR e.department <> 'IT') 
) 

Demo

2

Я думаю, что вы можете получить то, что вы хотите использовать в having пункт:

select company_id 
from employees 
group by company_id 
having min(department) = max(department) and 
     min(department) = 'IT' and 
     min(salary) >= 150000; 

Если вы хотите название компании, вы можете просто присоединиться, что:

select c.id, c.company_name 
from companies c join 
    employees e 
    on c.id = e.company_id 
group by c.id, c.company_name 
having min(department) = max(department) and 
     min(department) = 'IT' and 
     min(salary) >= 150000; 
+0

@CL. , , , Спасибо. –

Смежные вопросы