ORACLE EXIST (Подзапрос) - PullRequest
       7

ORACLE EXIST (Подзапрос)

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

Из того, что я узнал, условие SQL EXISTS используется в сочетании с подзапросом и считается выполненным, если подзапрос возвращает хотя бы одну строку.

Тогда почему этот код дает разные результаты?

/* #1 */
SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM employees
WHERE employees.department_id= 20);

/* #2 */
SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE employees.department_id= 20);

Я мог бы представить, если какой-либо из подзапросов возвращает какие-либо строки, которые они оценивают как ИСТИНА.Поэтому внешний запрос вернет все строки из таблиц сотрудников.

Однако только код # 1 возвращает все строки из таблицы сотрудников.# 2 возвращает ro, у которых отдел_ид = 20.

Ответы [ 3 ]

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

Запрос 2 должен быть следующим:

SELECT * FROM employees
WHERE EXISTS(
             SELECT * FROM departments
             WHERE departments.department_id= 20)

Вы используете псевдоним сотрудников, поэтому, когда идентификатор отдела отдела отличается от 20, подзапрос не возвращает строк, независимо от того, что условие находится внутриподзапрос, а не во внешнем запросе.

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

Это ваш первый запрос:

SELECT e.*
FROM employees e
WHERE EXISTS (SELECT 1
              FROM employees e2
              WHERE e2.department_id = 20
             );

В этом запросе внутренняя WHERE ссылается на внутреннюю таблицу.Таким образом, может произойти одно из двух:

  • employees имеет сотрудника в этом отделе.В этом случае все сотрудники возвращаются во внешнем запросе.
  • employees не имеет сотрудников в этом отделе.В этом случае никакие сотрудники не возвращаются во внешнем запросе.

Это все или все.

Второй запрос:

SELECT e.*
FROM employees e
WHERE EXISTS (SELECT 1
              FROM departments d
              WHERE e.department_id = 20
             );

Внутренняя ссылка на внешний запрос.Для каждой строки в employees запрос выполняется и проверяет, возвращает ли подзапрос какие-либо строки.Если это так, то строка возвращается.

Подзапрос вернет либо все строки из departments (если у сотрудника во внешнем запросе есть department_id = 20), либо строк нет.Итак, это эквивалентно:

SELECT e.*
FROM employees e
WHERE e.department_id = 20;
0 голосов
/ 08 октября 2018

Ключ имеет неверное имя:

SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE employees.department_id= 20);
      -- here should be departments.department_id

Вы ссылаетесь на столбец из внешнего запроса.То, что вы хотите:

SELECT * FROM employees
WHERE EXISTS(
SELECT * FROM departments
WHERE departments.department_id= 20);
...