SELECT e.employee_id, e.first_name ,e. salary
FROM employees e
Мы игнорируем вышесказанное, за исключением того, что говорим, что ищем сотрудников
WHERE e.salary > (SELECT AVG (e.salary) FROM employees e )
Если зарплата этого сотрудника превышает среднюю зарплату для всех сотрудников
AND e.department_id IN (
SELECT e.department_id FROM employees e WHERE e.first_name LIKE '%J%');
И где этот сотрудник находится в отделе, где имя хотя бы одного сотрудника содержит J
.
Далее!
select e.employee_id,e.first_name ,e.salary from employees e
Мы проигнорируемвыше, кроме того, что мы ищем сотрудников
where e.salary > (select avg(e.salary) from employees e
Если зарплата этого сотрудника превышает среднюю зарплату
where e.department_id in
(select e.department_id from employees e where e.first_name like '%J%'));
для сотрудников в отделе, где хотя бы один сотрудникимя содержит J
.
Оба отвечают на разные вопросы:
- Ищите сотрудников, где зарплата этого сотрудника превышает среднюю зарплату для всех сотрудников игде этот сотрудник находится в отделе, где имя хотя бы одного сотрудника содержит
J
.
и:
- Ищите сотрудников, где зарплата этого сотрудника больше tхан средняя зарплата для сотрудников в отделе, где по крайней мере одно имя сотрудника содержит
J
.
И обратите внимание, что разница именно в том, как "в отделе, где по крайней мере один сотрудникИмя содержит ограничение J
.Во-первых, он применяется в качестве ограничения на общий поиск сотрудников.Во-вторых, он применяется в качестве ограничения, по которому для сотрудника мы рассчитываем среднюю зарплату.
Учитывая формулировку спецификации, я бы сказал, что это правильно, что ограничение должно применяться ко всему поискуа не для расчета средней заработной платы, и поэтому первый запрос является правильным.
Почему я не могу использовать этот код, когда у меня вместо 'AND' 1046 * стоит 'IN' *
Я бы не охарактеризовал разницу между двумя запросами.Обратите внимание, что они оба используют IN
.Разница в том, к какому запросу (или подзапросу) вы применяете предикаты.Первый добавляет AND
, потому что теперь у нас есть два предиката, примененных к внешнему запросу, и нам нужен какой-то оператор для объединения этих предикатов (AND
здесь кажется правильным по сравнению с альтернативой OR
).
Во втором случае вы не обнаружите, что комбинируете несколько предикатов, потому что применяете предикаты к разным запросам.