Когда использовать IN OR AND в подзапросе?(База данных SQL оракул hr схема) - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно было выполнить этот подзапрос
EXP: написать запрос, чтобы отобразить номер, имя (имя и фамилию) и зарплату всех сотрудников, которые зарабатывают больше, чем средняя зарплата и которые работают вотдел с сотрудником с J в их имени.

И код для подзапроса следующий:

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%');

Почему я не могу использовать этот код, когда у меня есть 'IN' вместо AND

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%'));

Я знаю, что второй код неверен, но почему?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018
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).

Во втором случае вы не обнаружите, что комбинируете несколько предикатов, потому что применяете предикаты к разным запросам.

0 голосов
/ 11 октября 2018

Запрос требует от нас найти сотрудников, у которых их зарплата> средняя зарплата ВСЕХ сотрудников, и которые работают в отделе с любым сотрудником с буквой J в их имени.Итак, в вашем коде вы рассчитали среднюю зарплату только для сотрудников, которые работают в отделе, где любой сотрудник имеет J в своем имени.В этом случае вам нужно использовать И , поскольку средняя зарплата всех сотрудников и сотрудников, работающих в отделе, где любой сотрудник с буквой J не зависит друг от друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...