#sql #select #oracle-sqldeveloper #exists
#sql #выберите #oracle-sqldeveloper #существует
Вопрос:
Я думал, что следующий оператор SQL возвращает списки зарплат меньше 5000. Но я получил зарплату, которая больше или равна 5000. Я действительно не знаю, почему. Я что-то пропустил?
select salary
from employees
where exists (select 1 from employees e where salary < 5000);
Комментарии:
1. Обычно у вас есть коррелированный подзапрос, когда вы выполняете EXISTS.
2. Этот запрос возвращает строки, если существует пользователь с зарплатой < 5000 (независимо от того, кто это.)
Ответ №1:
Запрос внутри exists
оператора в вашем запросе возвращает по крайней мере одну строку, поэтому оператор вычисляет true
. Проблема здесь в том, что он никак не связан с внешним запросом, поэтому он возвращает один и тот же результат для каждой строки во внешнем запросе (т. Е. Всегда true
).
Чтобы получить желаемый результат, вам нужно сопоставить запросы, используя термин из внешнего запроса в where
предложении внутреннего запроса:
SELECT salary
FROM employees e1
WHERE EXISTS (SELECT 1
FROM employees e2
WHERE e1.emp_id = e2.emp_id AND salary < 5000);
Но, если быть до конца честным, вам действительно не нужен exists
оператор здесь, и вы можете просто запросить зарплату напрямую:
SELECT salary
FROM employees
WHERE salary < 5000