ПРИСОЕДИНИТЬСЯ подзапрос и другой результат - PullRequest
0 голосов
/ 11 ноября 2018

Я писал упражнение на тему «Напишите запрос, чтобы найти имена (имя, фамилия) сотрудников, которые не являются руководителями»

Я пишу это самостоятельно, и когда я проверяю результат или оба, у меня меньше строк, чем у другого. Я использовал функцию JOIN, а другая нет. Я хочу помочь узнать, почему два результата так различны.

Спасибо

тот, который я использую, присоединяется

SELECT 
first_name, last_name
FROM
employees AS E
    JOIN
departments AS D ON E.department_id = D.department_id
WHERE
NOT EXISTS( SELECT 
        0
    FROM
        departments
    WHERE
        E.manager_id = D.manager_id)
        order by last_name;

тот, кто не использует соединение

SELECT 
b.first_name, b.last_name
FROM
employees b
WHERE
NOT EXISTS( SELECT 
        0
    FROM
        employees a
    WHERE
        a.manager_id = b.employee_id);

Ответы [ 2 ]

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

Этот запрос может быть написан с использованием только таблицы «Сотрудники», но в своем запросе вы соединили таблицу сотрудников с таблицей отделов. Запрос должен быть написан с минимальным количеством таблиц, которое соответствует ожидаемому результату, объединение ненужных таблиц может привести к неправильным выводам.

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

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

Большая проблема в том, что подзапрос NOT EXISTS ссылается на строки из объединенной таблицы. Столбец manager_id содержит значение D., и это ссылка на объединенную таблицу, а не на таблицу в предложении FROM подзапроса.

          E.manager_id = D.manager_id
            ^^^^^^^      ^

Мы также подозреваем, что руководитель работника заносится в строку сотрудника как ссылка на другую строку в таблице работника. Но у нас нет определения схемы или каких-либо примеров данных, поэтому мы просто догадываемся.

Кажется, в таблице employee будет supervisor_id ...


SELECT e.first_name
     , e.last_name
     , e.department_id
     , d.department_id
  FROM employees e
 WHERE NOT EXISTS 
       ( SELECT 1  
           FROM employees s 
          WHERE s.id = e.supervisor_id
       ) 
 ORDER
    BY e.last_name
     , e.first_name

Также возможно, что некоторые строки в employee имеют значение в столбце department_id, у которого нет соответствующей строки в таблице department. Если в department совпадающей строки нет, внутреннее объединение предотвратит возвращение строки из employee.

Мы можем использовать внешнее соединение, когда хотим вернуть строки, даже если в объединенной таблице не найдено ни одной подходящей строки. Если мы хотим задействовать таблицу departments, поскольку под «супервизором» понимается работник, являющийся руководителем отдела, мы можем использовать шаблон против объединения ...

SELECT e.first_name
     , e.last_name
  FROM employees e
  LEFT
  JOIN departments d
    ON d.manager_id = e.employee_id 
 WHERE d.manager_id IS NULL 
 ORDER
    BY e.last_name
     , e.first_name

Опять же, без схемы и некоторых примеров данных, мы просто догадываемся.

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