#sql #oracle #oracle-sqldeveloper
#sql #Oracle #oracle-sqldeveloper
Вопрос:
У меня есть таблица people, которая содержит столбец username. У меня также есть таблица student, которая содержит столбец username. «Дэвид» существует в таблице people, но не в таблице student.
Когда я запускаю это, я не получаю результата, который не является правильным:
Select USERNAME
From PEOPLE
Where username = 'david' and USERNAME not in (Select USERNAME From STUDENT)
Order By USERNAME
Однако, когда я запускаю это, я также не получаю никакого результата. Как это возможно?
Select USERNAME
From PEOPLE
Where username = 'david' and USERNAME in (Select USERNAME From STUDENT)
Order By USERNAME
Ответ №1:
Если есть какое-либо USERNAME
значение in student
NULL
, то выражение вычисляется NULL
как . Это отфильтровывает все строки. Я предполагаю, что это ваша проблема.
Чтобы устранить эту проблему, я рекомендую никогда не использовать NOT IN
с подзапросом. Просто привыкните к использованию NOT EXISTS
:
where username = 'david' and
not exists (select 1 from student s where s.USERNAME = people.username)
Комментарии:
1. «Никогда не используйте NOT IN» — плохой совет (из-за «никогда»). Чтобы иметь дело с NULL, один из подходов заключается в использовании NOT EXISTS . Другой, одинаково допустимый подход заключается в том, чтобы сказать «NOT IN (выберите ИМЯ ПОЛЬЗОВАТЕЛЯ из STUDENT, ГДЕ ИМЯ ПОЛЬЗОВАТЕЛЯ НЕ РАВНО NULL )». То, что вы предпочитаете NOT EXISTS, не означает, что нужно «никогда» использовать NOT IN . Просто используйте его правильно.