Как работает оператор exists? Я не знаю, почему происходит результат

#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