2016-05-18 9 views
0

Я использую PostgreSQL 9.5.1 в терминале. Я следую учебнику. Существуют две таблицы: «is_called» с идентификатором и именем студентов, а «is_enrolled_on» - с курсами, в которые учащиеся участвуют. Я попытался создать запрос, который возвращает только студентов, которые не зарегистрированы на каком-либо курсе. Для этого я использовал условие «не существует», но я не могу понять, почему ученик с идентификатором 5 не возвращается, так как он не зарегистрирован на каком-либо курсе.PostgreSQL: понимание проблем Условие exests

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

Description of the queries in the terminal

+0

Добавить предложение where в подзапрос. –

ответ

2

Проблема заключается в том, что подзапрос просто выполняется без связи с внешним запросом. Он возвращает строки; следовательно, NOT EXISTS является ложным и строки не возвращаются.

Чтобы получить навык этого, начните с NOT IN:

select i.studentid 
from is_called i 
where i.studentid not in (select io.studentid from is_enrolled_on io); 

Затем преобразовать это NOT EXISTS:

select i.studentid 
from is_called i 
where not exists (select 1 from is_enrolled_on io where io.studentid = i.studentid); 

Следует также отметить, что select distinct не подходит ни для IN или EXISTS.