Почему подзапрос «СУЩЕСТВУЕТ» не ограничивается обоими условиями WHERE?

#mysql #sql

#mysql #sql

Вопрос:

Новичок в программировании здесь. Я хочу извлечь всю информацию из таблицы «сотрудники» вместе с их должностью из другой таблицы, но ограничиться «Помощником инженера», используя подзапрос «СУЩЕСТВУЕТ».

Я попробовал этот подход:

 select e.*, t.title
from employees e
join titles t on t.emp_no = e.emp_no
where exists (
  select * from titles t
  where t.emp_no = e.emp_no
  and t.title = 'Assistant Manager'
)
  

Когда вы удаляете условие «Помощник инженера» и помещаете его вне подзапроса, это работает, но я хочу проверить, возможно ли поместить его внутри подзапроса.

Большое вам спасибо за вашу помощь

Комментарии:

1. Отредактируйте свой вопрос и покажите запрос — в виде текста — на который вы ссылаетесь.

2. Что EXISTS здесь нужно? Поскольку на этот вопрос уже дан ответ, второй запрос в ответе полностью охватывает ваш вопрос. Для желаемого результата требуется только одно внутреннее соединение.

3. exists будет фильтровать сотрудников, у которых есть заголовок «Помощник менеджера», но объединение заставит ваш результирующий набор содержать все заголовки этих (отфильтрованных) сотрудников.

Ответ №1:

Это сработает, если вы удалите соединение, которое в вашем случае бесполезно и неправильно:

 select e.*, 'Assistant Manager' title
from employees e
where exists (
  select 1 from titles t
  where t.emp_no = e.emp_no
  and t.title = 'Assistant Manager'
)
  

Если вы хотите использовать соединение, тогда нет необходимости EXISTS :

 select e.*, t.title
from employees e inner join titles t
on t.emp_no = e.emp_no and t.title = 'Assistant Manager'
  

Комментарии:

1. Какова цель «1» в подзапросе? Это из-за логического значения? Является ли значение TRUE или FALSE взаимозаменяемым с 1 или 0?

2. 1 after SELECT... — это просто значение, используемое в операторах EXISTS. У него нет специальной цели. Это может быть 0 или * или null. Это просто показывает, что что- то возвращается (что-то существует).